打印

C语言一道面试题

[复制链接]
楼主: wxj1952
手机看帖
扫描二维码
随时随地手机跟帖
221
差个中间号.用个指针就完结,对吗?新手我是

使用特权

评论回复
222
highgear| | 2011-11-11 22:10 | 只看该作者
还在讨论?好吧,我来终结。

在 Keil C51 中,使用等号的结构复制与memcpy在底层汇编代码完完全全,一模一样,即使用等号的结构复制就是那个在51中效率极为低下的 memcpy. 因此,wxj1952的所有帖子都可以被看作胡扯。

使用特权

评论回复
223
er357951| | 2011-11-12 09:44 | 只看该作者
哎哟,浪费生命啊~~~在这么美丽的神棍节第一个深夜,我竟然在看这么一个生物发的烂尾贴,………
本来只是好奇这个问题的标准答案的,谁知……
再一看发帖时间,X!08年!2面前的问题贴!我竟然一页一页,一贴一贴的,全部看完了!从头到尾,找不到一贴楼主一开始就说要给的答案!~~~
然后觉得看完此贴收获不是一般的大~~~
首先真心感觉每一个认真回答问题和研究问题的朋友都非常真心,非常可爱
真心佩服IceAge前辈的专业,耐心大度,和将军令前辈对对象的精辟解释~~~以及所有深度各个角度刨析问题的大虾~~~
那个时候的讨论气氛真好~~~
到后来,那个飘渺的答案根本不重要了,就算有,讨论的过程本身就比答案有价值得多~~~
然后此刻心情久久不能平静,心血澎湃,惊叹此神贴侧面反映和蕴含了很多方面的知识,比如技术,道理,修养,信用,性格,人生观……自叹不如,遂打下二三文字,以做纪念。(虽然知道此时论坛是不能发帖的,还是要复制粘贴一下)
哎,青春啊~~~
观后感 ﹠心里话:
真爱生命,远离Any'wxj1952'问题神贴!
2011-11-12  3:08  at NOKIA s60

使用特权

评论回复
224
lczsx2000| | 2012-1-27 19:45 | 只看该作者
春节放假的时间,无聊,回看了21ic以前的帖子,没想到有这么多精彩的。这3年多来,比较少来21ic,错过了最精彩的讨论,遗憾!
这个题,如果要求只使用"="运算符来赋值,最好的答案还是使用指向数组的指针这样一个数据类型来操作比较好,其他的就不讨论了。

还是那句,aiwei网友点出的:"楼主只是抓住做单片机c编程的工程师不太关注的知识面,要是在专业做软件的出这种题,也太小儿科了"。

当然了,我会使用这种方式招人,这样能看出应聘者功力到底有多深,直接使用memcpy的是一般人,如果他能拿到8000的月薪,那使用结构体和指向数组的指针来拷贝的应聘者,我会建议老板给出10000的月薪。话说回来,在正常的编码中,我还是更愿意使用memcpy来实现。

使用特权

评论回复
225
llp133| | 2012-1-28 22:24 | 只看该作者
()A=()B这不是整体赋值吗?kao

使用特权

评论回复
226
chjmacong| | 2012-1-29 09:56 | 只看该作者
同意86 87楼的两位高手!
题目实现整体复制,那么就要开辟整块空间,用结构体开辟OK,然后结构体整体复制,实现题目要求。
86和87两位实现思想是一样的,但是我支持:
*(struct AB{int x[10];}*)b = *(struct AB*)a;
理由只有一个:简洁!

使用特权

评论回复
227
刘前辈| | 2012-1-29 14:56 | 只看该作者
本帖最后由 刘前辈 于 2012-1-29 14:58 编辑

俺进修C语言的时候,才弄懂1952这个问题,进修后觉得本科学的C语言只是皮毛:本科学C的时候老师和教材上根本没讲。连内容都没有。——幸亏面试时公司没拷俺这个问题。

概念:C语言中,数组名退化为常量指针,是矢量,因此不能整体拷贝。而结构名是标量,一个标量可以用名字来进行内容拷贝,C语句才不关心你这个标量名类型是struct还是char,只要=两边类型相同,统统可以写为 A=B。

这里考的基本概念是:“C语言中,一个变量具有2个基本特征,……”哪2个基本特征?马忠梅的书上写了吗?没写!清华张培仁教授的C51教材上就写了!而且好像只有清华的C51教材上写了。马忠梅教授是北京理工大的;——所以凭什么说清华的教授就是和其他大学的教授不一样?

唉!一声叹息。



typedef struct
{
char trr[10];
}TYP_C;

TYP_C  B, A;

main()
{
A=B;

while(1);
}



、、

使用特权

评论回复
228
aihe| | 2012-1-29 21:48 | 只看该作者
典型的拉不出屎怪马桶不好
不过话说回来,现在在学校里的,有几个把教材仔细研究,仔细看的
再说教材上没有,不等于其他相关书籍上没有,都是上大学的人了,碰到问题查找资料的能力都没有,怪学校教材上没有,太说不过去了吧。

使用特权

评论回复
229
lczsx2000| | 2012-1-29 22:26 | 只看该作者
拉不出屎怪地球引力不够

使用特权

评论回复
230
sjc_sugar| | 2012-1-30 17:09 | 只看该作者
学习了,继续挖掘!

使用特权

评论回复
231
jiebin689| | 2012-2-23 12:05 | 只看该作者
顶贴!!!!
这是我看到的最精彩C语言论坛辩论。

使用特权

评论回复
232
cc389518| | 2012-2-24 13:43 | 只看该作者
void transfer(unsigned int *a,unsigned int*b)
{int i;
for(i=0;i<10;i++)
    {
       a[i]=b[i];
       }
}

我用一函数写的  直接调用 transfer(a,b);
a内的数据就和b一样了。

使用特权

评论回复
233
weldking| | 2012-2-24 20:21 | 只看该作者
不会啊

使用特权

评论回复
234
刘前辈| | 2012-2-25 13:18 | 只看该作者
本帖最后由 刘前辈 于 2012-2-25 13:24 编辑

其实别看垒了200多楼,实质问题没一个看出来!不知道1952当年看出来没有。反正所长是没看出来。最年长,代表最高水平的所长认为:最正确的、绝对没有问题的、答案是:
         memcpy(*a,*b,sizeof(……));

所长:“谁不用memcpy(),赶出论坛!”

哈哈,所长说的竟然是以K&R C标准为基础,难道不知道ANSI C 已经明确定义、改进了K&R C 关于结构不能拷贝的问题? 上面这个库函数的不足,就是:假定目标指针a + i  指向的内存超过源指针b指向位置时,memecpy( )函数将发生源数组数据被覆盖丢失!编译器无法检测出这类问题,编译器规则是:——“定义了一个指针,就相当于定义了一个未知(用户程序任意定义)长度的数组”。

举个例子:(与本题目具体无关)
char str[7]="aabbcc";
memcpy(str+2,str,4);

上面运行结果,源数组数据成了"aaaabb"! —— 灾难发生。

而2个同类型结构拷贝,决不会发生这种情况。编译器就确定了内存的正确分配。


看来LZ这道面试题并不简单。


、、


、、

使用特权

评论回复
235
ssy250| | 2012-2-25 14:08 | 只看该作者
闹这个,我感觉很没意思,C的精髓在于贴近硬件,执行效率高,便于优化,规范性好,要是硬要搞什么整体,对象,直接搞C++去,何必劳烦C?出这个题的人思维还是像语文课的标准答案的思维,胡搞~~

使用特权

评论回复
236
tylhc002| | 2012-2-25 14:43 | 只看该作者
1# wxj1952

使用特权

评论回复
237
刘前辈| | 2012-2-25 15:55 | 只看该作者
我不懂的东西,一般都会说“没啥意思,小儿科嘛。”结果……


、、

使用特权

评论回复
238
highgear| | 2012-2-26 10:13 | 只看该作者
且!!!!!!!!!!!!!!

刘公公还不死心啊,这种笑柄问题还在强辩,只是留下更多的笑柄而已,就像235楼。235楼确实说明了刘公公,也就是过去的那个 wxj1952 对技术的理解不到位。

使用特权

评论回复
239
jq1604| | 2012-2-26 17:04 | 只看该作者
用strcpy函数?形式也不像啊!考这样的题是不是有点太钻牛角尖?

使用特权

评论回复
240
刘前辈| | 2012-2-26 19:25 | 只看该作者

咱也就只会教儿子玩玩555时基电路,对555绝对理解到位……

本帖最后由 刘前辈 于 2012-2-26 19:43 编辑
#239 农民讲习所所长
刘公公还不死心啊,这种笑柄问题还在强辩,只是留下更多的笑柄而已,就像235楼。235楼确实说明了刘公公,也就是过去的那个 wxj1952 对技术的理解不到位。


所长又中了圈套:235楼的实例摘抄自美国2005年出版的《C/C++函数库函数查询词典(最新版)》。

总有些人自以为是:“俺不看书,照样天下第一。”“俺智商比爱因斯坦高……”这种人让别人看起来,有点精神不正常。

#235
举个例子:(与本题目具体无关)
char str[7]="aabbcc";
memcpy(str+2,str,4);

上面运行结果,源数组数据成了"aaaabb"! —— 灾难发生。


刘前辈绝对没有这个水平举这样“理解不到位”的“笑柄”例子,也只有所长这样自诩“天下第一”,“爱因斯坦第二”的让人讥笑的“超级高手”才有自己的“到位的理解”;——好像C/C++库函数就是highgear父子二人做的似地。

咱刘前辈大概只能在讲习所门口扫扫地,把 555时基电路玩的“天下第一转”,剩下的都是嘴上的本事了。

再抄点《函数库查询词典》上的内容,让美国人多给中国的所长留下点理解不到位的笑柄:

memcpy()函数说明:
   从源缓冲区中拷贝指定数目的字节到目标缓冲区中。如果源缓冲区和目标缓冲区是重叠的,则本函数的拷贝行为结果不确定。请使用memmove()来处理重叠缓冲区。
      要确保目标缓冲区的长度不小于源缓冲区。


嘻嘻,所长又要犯病了:
“这句话有严重的语病,应该是……”
“刘前辈对这句话完全理解错了,到位的理解应该是……”

哈哈……,反正都是别人的错,写书的贝尔实验室的老外把所有库函数都写错了,出版了几百万本误导千万人,中文翻译也翻错了,处处语病,查字典的读者这一段都理解错了——理解不到位。
    正确的理解应该是:之乎者也……  原来highgear 也不知道!至少你一本也没写出来……笑柄?
   
       不知道你瞎咋呼个啥?有那咋呼的闲功夫笑别人写出个东东给别人看看你的到位水平才好。要不俺只知道你会玩555时基电路,竟然能用多个555实现多任务并发系统!?唉!我们还上大学学什么单片机?真惭愧不如“爱因斯坦第二”。确实是二。


、、

使用特权

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

本版积分规则