打印

C语言一道面试题

[复制链接]
楼主: wxj1952
手机看帖
扫描二维码
随时随地手机跟帖
81
IceAge| | 2008-3-25 22:49 | 只看该作者 回帖奖励 |倒序浏览

关于这个问题, 应该使用 memcpy

结构体直接赋值,与compiler 相关。但是题目并未指定编译器,所以并不一定能编译通过, 因为 结构体直接赋值 并不被 c 的旧标准或compiler 所支持。

另外,从程序编写的角度来说,memcpy 显然会比 结构体强制赋值更清晰易懂,而且不会“令人不安“(检查代码时,对于结构体强制赋值,你得多花一些额外的思考, memcpy 则不会)。不用怀疑 memcpy 的效率,这些 memory 的函数基本上是根据 cpu 用汇编写的,你不可能会找到比这更好效率的方法了。

所以,使用 memcpy 是正解.  

使用特权

评论回复
82
wxj1952|  楼主 | 2008-3-25 23:17 | 只看该作者

心胸大度一点

中国软件业的现状就是20年弄不出个OS来。不是做不到,而是想不到。

我们公司的现状就是我们经理想招个软件技术总监招了3年也没找到。程序员一抓一大把,可惜满大街全一个样。不是for就是memcpy,就是找不出个不一样的。

LZ的题目就是他的把戏。3年没一个人讲得清的。

问80楼:10个人有10个答案?杜撰呢吧,那是美国人还差不多。要不LZ的题怎么没看见有第二个符合题意的答案?80楼写一个不一样的试试?不用写十个,一个与别人不一样的思路就行。马上就是技术总监。

争论了了半天,原来是学长连21楼的程序都没看懂,“一会儿C不能实现,一会儿没typedef不行,一会没struct不行。”总说21楼写错了,自己才是对的,我还错以为是故意跟我胡搅蛮缠呢。对不起,学生向你道歉,发火发错了。

中国人是100个人一个答案,要不怎么通过高考?昨天还在说:“现在中国大学的教育就像蒸包子,出来的学生全是一个模子的。”


中国现在提倡创新型国家,发愁啊。10个人10个答案?总理一定颁奖啦。

印度剩下那个是软件天才,有十分之一软件天才这国家就了不起了。

还有最不好的一点,就是怎么一说别人不行自己就那么兴奋。“你做出来了,把我往哪放?”错了就错了,学长大度一点好不好。

使用特权

评论回复
83
IceAge| | 2008-3-26 01:44 | 只看该作者

楼上你看法太片面

思想不应该受到约束,但行为要受约束。你在自己的房间里怎么做都行,裸奔都可以,但在大街上就不行。10个人做10样事并不难,难得是10个人做一样事。论软件天才,中国强出印度很多,看看那些软件大赛的排名。但无论如何,中国在 it 方面比印度差很远。很简单的原因:一个中国人顶2个印度人,10个印度人顶 20 个中国人。不要把技巧的卖弄当作技术,当作创意更可笑。

再回到原来的话题,大道至简,最直观,最简洁的方法是最好的方法。

使用特权

评论回复
84
HWM| | 2008-3-26 14:29 | 只看该作者

谈谈我为何给21楼的程序"F"

先列出原始程序如下

typedef
{
  int a[10];
}AB

main()
{
*(AA*)b=*(AA*)a;
while(1);
}

首先解决语法问题,下面给出具有正确语法和规范格式的相关程序:

typedef struct // 补上struct
{
    int a[10];
} AB; // 补上;

int a[10], b[10]; // 主题没了还谈什么

int main( void )
{
    *(AB*)b = *(AB*)a; // AA != AB,这么简单都可能出错,可见这里问题的严重性!
    while(1) ;
}

好了,到此算是能过编译了,当然执行结果也没问题。那么是否就完美了呢,看下面分析:

首先看到的是,在程序中有三处出现了“10”和“AB”,两处出现了“*(AB*)”,而这些地方必须保持一致性,问题是谁来保证呢?

再往下看,a和b原先好好的指向int,在此却要强行将其指向AB。不知它是否愿意,但我看来和指鹿为马没啥差别。另外既然可以指鹿为马就不会那天变成指鹿为鸟或指鹿为鱼。牛头都对不上马嘴,那玩意儿能保证对得上吗?

最后看封装,愿意的话也可以称为包装。原本若封装好了,采用赋值复制是一件相当漂亮的事。但看看上面的程序,那两大驼东西( *(AB*)b 和 *(AB*)a )。更有甚者(见前帖)

*(struct AB{int x[10];}*)b = *(struct AB{int x[10];}*)a; // 原 *(struct AB{int x[10];}*)b = *(struct AB*)a 错误

象这样的**秀也太刺激了吧,问题是这不是吃波饭,不需要这玩意儿。

分析到此各位看看到底该打几分?

我以前以为(也是我经常和弟子们说的),读书要把书从“厚”读到“薄”,别越度越厚了。今天我才领教了更厉害的,能把书给读没了,就剩书名了。

使用特权

评论回复
85
xhtxzxw| | 2008-3-26 23:46 | 只看该作者

嘿嘿

*(struct AB{int x[10];}*)b = *(struct AB{int x[10];}*)a; // 原 *(struct AB{int x[10];}*)b = *(struct AB*)a 错误
请问谁说这是错误啊???到底谁错误了???建议试过以后下结论吧!否则可能会误了你的弟子。

高手们也许都是出题的角色,不是做题的角色,这是我的推测。否则应该仔细地看看LZ的门面帖。LZ希望大家对所出的题给出答案,并没有请求大家评价题目是否合适,更没有请求大家出别的题。

LZ所说的是,出题人(不一定是LZ)要求:必须给出“...b = ...a;”的形式,这意味着:1、在此语句之前之后不得有其它语句;2、在标识符 a 和 b 的后面不得有其他符号。

至于出题人为何提出如此要求以及这样的要求是否很BT很SB,这似乎应该是另外讨论的问题,这个大楼应该关心的是:给出的答案是否BT或SB,判断答案BT或SB的标准是:不满足出题人的要求。

如果一个做题人(往往就是应聘者)不按要求做题,而是对出题者给出的题评头品足,大多数情况下,估计结局不妙。

我**我的答案:
*(struct AB{int x[10];}*)b = *(struct AB*)a;
并愿意向大家学习,希望有人能写出更简洁的形式。

使用特权

评论回复
86
HWM| | 2008-3-27 07:47 | 只看该作者

回87楼:你那玩意儿确实没错,当初我是用下面的语句试的。

*(struct AB{int x[10];}*)b = *(AB*)a;

在此表示抱歉。

不过从另一角度来看所谓“简洁”就有商榷之处了,因为如此之“简洁”确实相当的容易看错或写错。希望你是个永远不会错的人,但我不行,办不到。我只能依靠简洁明了的形式和基本的语法约束来保证尽量的少出错,乃至不出错——看来难。

使用特权

评论回复
87
xhtxzxw| | 2008-3-27 10:21 | 只看该作者

嘿嘿

回楼上
再次强调:我们的回答必须满足LZ题目的要求。
至于是否容易出错,那是另一回事,跟LZ的题没有关系。
老实说,平时绝对不会也从来没有以这样的风格写过程序。

使用特权

评论回复
88
HWM| | 2008-3-27 10:23 | 只看该作者

明理就行

使用特权

评论回复
89
wxj1952|  楼主 | 2008-3-27 10:31 | 只看该作者

这里考的是概念,不是谁在应用中更合理。

同意87楼。

“如果一个做题人(往往就是应聘者)不按要求做题,而是对出题者给出的题评头品足,大多数情况下,估计结局不妙。”

   我们久经考场,连这种基本规则还用去反复强调、解释?如果是我们经理,他跟你解释?一个请的手势,“有好消息我们通知你。”“下一位。”

高考题在应用中合理吗?它就是刁难你,就是看你概念学得怎么样。它是用来拔尖子的,或者说是用来怎样从100个考生里筛掉99个而出的题。结果你在试卷上大谈“更合理的解决方案应该是.....”显示比考官还高明。

“如果招100名大学生,我会去中国。因为那里前几名的高校水平很高。但如果让我招一万名大学生,我就去印度,因为那里的大学普及性比中国好。
         ——google公司中国地区总裁李开复对中印高等教育进行对比

中国只有清华、复旦这样几所名校能挑出100个像样的软件人才?其他高校都只生产“包子”?所以,我没想的的事情,87楼想到了,我首先学会赞赏,而不是事后诸葛亮,“这么简单谁不会.....”

这世界是多元的,多一份不同,就多一份缤纷。谁能为这世界多增加一种颜色,这一生就没白活。

使用特权

评论回复
90
wxj1952|  楼主 | 2008-3-27 10:37 | 只看该作者

请教IceAge 老师

 IceAge老师:
在答案还没公开之前,想请教老师几个问题:
1、老师学C语言是哪本主教材?哪年出版的?中国教授写的?
2、在这道题之前,老师用的何种C版本?

我认为这道题没有与C版本的年轮有关的问题。请看答案。

使用特权

评论回复
91
IceAge| | 2008-3-27 11:40 | 只看该作者

关于结构体赋值,我知道 c99 可以

我记得 turbo C 2.0 不可以。c89 似乎也可以。

anyway, 从程序设计的角度看,memcpy 比结构强制再赋值更清晰直观,是更好的做法。如果是想探讨技巧,另当别论。

使用特权

评论回复
92
xhtxzxw| | 2008-3-27 14:36 | 只看该作者

嘿嘿

同意楼上。除开一些特殊的CPU而外,应该是memcpy的效率最高。原因是:memcpy函数代码针对具体的CPU做了充分的优化,进一步说,几乎所有的(即使不是全部)标准C函数代码都针对具体的CPU做过充分优化。

使用特权

评论回复
93
ccy668| | 2008-3-27 17:20 | 只看该作者

回 23楼 24楼!

   结构体可以直接复制, 但如果结构体里面有数组时,  就不行了!!

使用特权

评论回复
94
令狐聪| | 2008-3-27 22:23 | 只看该作者

什么是C51 谁能告诉我? 多谢

使用特权

评论回复
95
nlgz| | 2008-3-28 10:02 | 只看该作者

57楼的才是正道.

到底要比什么呢? 本来就没有绝对最好的.

比效率那就都编译仿真一下,看看谁的运行更快;
比维护那就看看谁的简洁标准而且严密;
比技巧那就看谁的想法更多更新颖,不过看都不容易看明白的那种买弄的技巧就免了;

其实归根截底,比的是大家心目中比较好的程序的标准是怎么样的.

我认为57楼说的那才是好程序的标准.脱离了这个比来比去其实没什么意义.

使用特权

评论回复
96
风中的舞者| | 2008-3-28 10:46 | 只看该作者

争论很激烈。。。。。

一个想要入行的门外汉飘过。。。。

使用特权

评论回复
97
lianda_| | 2008-3-28 15:13 | 只看该作者

用结构体就行了

struct str_name
{
    int scr[10];
}st_1,st_2;

main()
{
    int i;

    for(i=0;i<10;i++)
        st_1.scr=i;

    st_2=st_1;
    for(i=0;i<10;i++)
        printf("%d ",st_2.scr);
    printf(" ");
}

使用特权

评论回复
98
yzqok| | 2008-3-28 15:23 | 只看该作者

俺还要抓紧练习

使用特权

评论回复
99
fengyeu| | 2008-3-28 17:02 | 只看该作者

wxj1952........................

wxj1952........................ !!!!!!!!!!!!!!!

使用特权

评论回复
100
ATmega32L| | 2008-3-28 19:11 | 只看该作者

用结构体封装数组就能整体赋值。

用结构体封装数组就能整体赋值。

使用特权

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

本版积分规则