打印

C语言一道面试题

[复制链接]
楼主: wxj1952
手机看帖
扫描二维码
随时随地手机跟帖
161
cetclyb| | 2008-4-4 08:14 | 只看该作者 回帖奖励 |倒序浏览

从执行效率上看,结构是直接用循环的耗时的10倍都不止

从执行效率上看,结构是直接用循环的耗时的10倍都不止

使用特权

评论回复
162
IceAge| | 2008-4-4 10:31 | 只看该作者

顶 fsaok 的最终总结

不过:memcpy (scrB, scrA, sizeof(scrA)); 稍有不妥, 可能会产生问题

memcpy (scrB, scrA, sizeof(scrB)); 或者
memcpy (scrB, scrA, MIN(sizeof(scrB), sizeof(scrA)));

则安全很多 

使用特权

评论回复
163
dai_weis| | 2008-4-4 18:46 | 只看该作者

149楼,真是高人

使用特权

评论回复
164
ahwei| | 2008-4-4 20:10 | 只看该作者

结构赋值在实现时还是调memcpy,呵呵。

没有必要搞这种放屁脱库的东西,楼主只是抓住做单片机c编程的工程师不太关注的知识面,要是在专业做软件的出这种题,也太小儿科了

使用特权

评论回复
165
wxj1952|  楼主 | 2008-4-4 20:44 | 只看该作者

C语言最后还不是编译成汇编,多此一举。

我与167楼老兄看法绝对相同,知音呐。

高级语言最后还不都是机器码,没必要弄那么复杂是不是。我看贝尔实验室这帮人都是吃饱了没事干,还老装的哲人似的。

使用特权

评论回复
166
wxj1952|  楼主 | 2008-4-4 21:21 | 只看该作者

支持164楼,顶!

“从执行效率上看,结构是直接用循环的耗时的10倍都不止 ”

绝对!你看133楼的实验代码,他那一个LCALL ?C_COPY ,一个调用开销,谁知道它占用了多长时间,我看真的10倍不止。我用数组按字节传输,别看我方法简单,我是利用C语言的另一个特征——汇编语言特性。(既有高级语言的特性,又能处理机器硬件的汇编语言特性)没有调用开销,绝对比高级语言特性语句开销小,快。
memcpy( )与结构赋值时间开销一样?都一样逊,靠边站!最后还不是汇编最快。

什么?“133 楼实验证明了运行速度,前者运行占用了176个机器周期,后者占用212个机器周期。”

搞错了吧,理论上说不过去。估计差了个小数点,多半是17.6个周期。13倍!还差不多......。

Oh! 没注意,算倒了。

使用特权

评论回复
167
IceAge| | 2008-4-4 22:41 | 只看该作者

wxj1952:佩服,佩服

我对您的敬仰犹如长江之水,连绵不绝

使用特权

评论回复
168
wxj1952|  楼主 | 2008-4-5 10:12 | 只看该作者

向老师致歉,对不起。

170楼老师把位置搞颠倒了。您的年龄及我父辈,怎么可能敬仰我呢?您该不是在暗示学生注意尊师重教吧。否则下面这段话学生真不理解了:

   “ 你认为我比你差的很远,根本不重要,也没有人贬低你的答案,这里是技术论坛,你要说好,就请拿出理由来,说明为什么好,不要拿教材或者是ansi c 作依据,众人的回答哪些是超出了教材或者是ansi c?更何况ansi 至今还存在争议, 比ansi高明的东西还有很多。”

    学生虽然逗乐于那些总是习惯 sling mud at others so as to boost oneself 的老师.  但是从不用“than ”这个词。老师处处拿自己和别人“比较”,甚至把“我的答案比目前的答案”还“差得远呢”这句话,也要误理解为“你比我差得远呢。”burn your fingers ?这里特向老师解释一下,顺便致歉。

    论坛上我们都知道老师您著作等身,声誉内外。值得学生终身仰仗,怎么可能去“认为我比你差得远呢。”教授和学生,不在一个层次水平上,根本没有可比性,老师把自己评估的太低了。我倒是十分欣赏ahwei老师的性格和sight,我们在他眼里,包括Andrew S.Tanenbaum 这样的作者在他眼里,都不过是小儿科罢了。再怎么跟他逗闷子,他都不屑一顾,“儿子看不起老子。”照样开开心心。
       两位老师心理互补就好了。

“比ansi高明的东西还有很多。”比如说老师您想到的/写下的就是,讲课从“不要拿教材或者是ansi c 作依据,”以后ANSI会参考您的creativity思想,pick your brains,并据此制订世界标准。

使用特权

评论回复
169
wxj1952|  楼主 | 2008-4-5 10:41 | 只看该作者

看来我要公布答案真是自取其辱了。

两位老师,一个说“不要拿教材或者是ansi c 作依据”。一个说世界著名计算机教材的作者是“小儿科”。

可是我的答案都是书上的内容,万一不知趣,还以大师作依据,岂不会被老师嘲笑小儿科?

老师希望学生有创意的答案,老师开始不知道结构可以用赋值号实现拷贝,那么21楼的程序就算是新创,因为几位老师都没有率先想到。讲了一辈子C课程也没有讲到。于是心里不平衡了。“这也算创新,可笑!”“小儿科嘛。”
当我告诉老师,这些都是教材上的内容,不是学生创新,“教材?教材也是在不断变化的嘛,别拿教材和ANSI说事儿。”

反正总能让你学生左右为难。最好别公布什么答案,否则“学生都能想到,把我教授往哪放?”

再请教2位老师一个问题,当一个数据PACKET从网络层向物理层下传的时候,C用什么方法?(按字符串传?那是一幅图像数据!)



使用特权

评论回复
170
IceAge| | 2008-4-6 19:45 | 只看该作者

haha, wxj1952 厉害厉害

俺服了,什么也不说了。

使用特权

评论回复
171
ahwei| | 2008-4-6 21:44 | 只看该作者

幸好看楼主题目之前俺还是算会用结构赋值的

好几个月没有上网了,来这个版凑凑热闹,呵呵,牛人们继续!
我也在几个系统下仿真过,
结构赋值在不同的编译器中实现有所不同,在vc中,直接用rep movs 串复制指令实现, 在gcc中调用memcpy,在iar msp430中调用 CopyMemoryWords,ccs中调用__strasg汇编库。
无论如何,对于数组复制来说,调用memcpy与结构赋值,多出的也就是调用函数的开销,特别是在8位机中,如果不是这样,就说明memcpy的汇编库还有优化的余地。
大家火*味不要太浓,呵呵!

使用特权

评论回复
172
fsaok| | 2008-4-8 07:58 | 只看该作者

工艺品和产品

一个美的工艺品和一个产品不一样,一个有创意的价值高的工艺品是不适合大规模生产的,人类需要大规模生产的产品,同时也需要有创意的工艺品,这就是现今世界的不同需要。

这道题目,从美的角度来看,很有意思,

使用特权

评论回复
173
superclee| | 2008-4-8 08:39 | 只看该作者

看贴,不回贴

使用特权

评论回复
174
110xia| | 2008-4-8 08:52 | 只看该作者

学习了

使用特权

评论回复
175
HWM| | 2008-4-8 08:52 | 只看该作者

技术 != 艺术

技术的美在于简洁和清晰。其实科学乃至数学也一样,看看那些著名的定理或定律,它们的数学形式有多么的简洁明了。

艺术美不同于“技术美”,它的价值在于能激发起人们的情感反映。只要是和谐,对称乃至某种复杂性都会激起人们的正面或反面的情感反映。

使用特权

评论回复
176
将军令| | 2008-4-8 14:46 | 只看该作者

支持175楼

使用特权

评论回复
177
wxj1952|  楼主 | 2008-4-9 14:20 | 只看该作者

stubbornly adhere to my oppinions

十二分的肯定下面2点概念:

1、&a[0]=*&a=a ;

2、任何C++编译器都是建立在C编译器根基之上的。(以原始C编译器为内核的。)

       “任何有效的C程序都是有效的C++程序。”   ——摘自《C++ Primer Plus》(C++的二重性)

所以,任何C程序都能在C++编译器下编译/调试/通过。
所以,本帖上所有的C/C51程序,同时也是C++程序。都能在C++编译器下通过。(C51只要没涉及硬件。)

使用特权

评论回复
178
wxj1952|  楼主 | 2008-4-9 15:06 | 只看该作者

支持174楼。

就是有一点特别不明白,题目要求的是用C语言赋值号“=”实现,没有问
“有几种方法?你将怎么做?”

结果怎么就扯到了memcpy( );for;C++ ? 南辕北辙,不合题意呀。要是这样,这题还值得出么?还会用来做面试题么?

“人所皆知的问题,应试者要显示自己的亮点还是弱点?”


“在我的面试经历中,通过一些具体的程序问题来考察人,往往是最有效的,即使是一些人所皆知的问题,也往往能够挖掘出被面试者的亮点或弱点,原因在于,每个问题都有不同层次的解答之辞,面试者总是可以刨根究底地问下去。我们在看一段程序的时候,思路固然重要,细节也是不可忽视的,比如......,等等。这些细节可以用于考察基本功,毫无疑问,基本功不扎实的人通常很难得到面试者的青睐。”

( 注:谁也没说用了结构就表现了应试者的基本功.....但是可以作为一个引子来继续欣赏应试者的亮点,“面试者总是可以刨根究底地问下去....”

 “为什么结构名可以赋值拷贝,数组名却不能?”
 “C数据类型分几类?按什么原则分的?”
“一个变量的基本特征?”
“函数说明是否为形参分配内存了?”
“结构或数组做函数形参会有什么问题?怎样解决?还有么?......”
“......”

使用特权

评论回复
179
fsaok| | 2008-4-10 18:44 | 只看该作者

开始讨论新的问题

wxj1952 老师出的题目,我想各位高人的答案也差不多出尽了。

一句话,精彩!

下一个问题是,我来想一下这个题目的目的。

声明一下:俺是个粗人,只知道从结果去推理。

如果这个题目是C语言知识竞赛,当然要按题目要求,用C语言赋值号“=”实现,才得分。

但如果是公司招聘的话,就不是这样说了,

俺是个粗人,也不知道印度的软件公司是如何运作,也不懂C99或者C93,俺只会看结果

先看看要求招聘的层次,

一、如果是招聘一般的程序员,用memcpy( );for;的方法实现,容易出错吗?繁琐吗?似乎不是,所以,这个考察意义不是很大。

对于招聘进来的这个程序员,将来的工作是写代码,很多时候只要应付实际使用的需要,用memcpy( );for;的方法和用 “=” 的方法,无论是从产品的文档的简洁性,或者可靠性、出错机会等,我觉得并没什么区别。

如果在不出错的前提下,把编写实现这个功能的模块的工作量减少到最少,才是最好的程序员。

二、如果是招聘项目经理,项目经理的精力不应该集中到具体的细节,而应该
在于对如何做需求分析,功能概要设计,设计系统架构,以及业务相关的基础框架,测试的方法,文档管理等。

只有做C编译器的公司,对这个“=”的要求是最高的。

竞赛一定要分出胜负高下,所以要有一定的特定条件。而工作是每个工作日都要做,不需要胜负,只是要脚踏实地去做。

刘翔跨栏是最快的,但如果招聘做送货员,他就不一定是最好的。

想起一个故事,有一个亿万富翁招聘司机。因为司机的好坏,关系到他的身价性命。

最后有三个司机进入了最后选拔中。

亿万富翁出一个题目:汽车靠近悬崖时,你们会停在什么位置?

第一个司机说自己可以开到悬崖边上30cm,

另一个司机为了表示他的技术高,说可以把车开到离悬崖20厘米处。

剩下那个老司机说,我开车离悬崖越远越好,因为那样太危险了。最后这个老司机被选中了,

所以,对于招聘者来说,答案的可能是没有标准的。

使用特权

评论回复
180
蓝色日出| | 2008-4-12 17:19 | 只看该作者

占个位儿

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则