免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 绿茶主演
打印 上一主题 下一主题

华为面试题真火,来个冒牌的!  关闭 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-11-24 10:54 |只看该作者
vs2005下等于9,不知9是怎么算出来的?

论坛徽章:
0
32 [报告]
发表于 2006-11-24 11:11 |只看该作者
把汇编代码扔出来分析分析吧!

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-08 06:20:00
33 [报告]
发表于 2006-11-24 11:45 |只看该作者
这个主要是看用什么C了(与编译器有关)。用GCC, 它是从左到右。++优先级 高。 先算一个()。再算第二个(), 然后算二者之间的+号。 这样,答案是  7

如果用MS的studio 2005。它是先算 ++ (自加先算,优先级高), 把所有的 ++ (自加)算完, 再做 +,这样答案就是  9


如果原题中有 4项, 即增加一项 ++i 。 那么用GCC 就是 11。
用 MS V-studio 2005 就是  16 。

依次类推。

论坛徽章:
0
34 [报告]
发表于 2006-11-24 11:58 |只看该作者
To 1jjk
>> 但愿我没有误人子弟
>> 把汇编代码扔出来分析分析吧!

误己又误人。C FAQ Question 3.2 中有这么一句话送给你:

(对于这种无定义的表达式,)Don't even try to find out how your compiler implements such things, let alone write code which depends on them (contrary to the ill-advised exercises in many C textbooks)

To 木刀客

你的误解表现在两个方面:

1. 认为对于这种无定义的表达式的结果在特定的编译器中结果是固定的,或者说是有规律的。这是得不到保证的。对于无定义行为的结果作出的任何假设(比如在 GCC 中会得到 7、在 VC 中会得到 9 等)都是不正确的。

2. 认为表达式的计算会从优先级高的运算符开始。这其实是一个很普遍的误解。

如果真如你所想的那样,那么 (++i)+(++i)+(++i)  的结果一定是 9,而不会有其它结果(例如 7 等)。

其实优先级(以及结合性)只是确定了表达式的组合顺序,然而 C/C++ 并没有规定表达式中各个操作数的计算顺序,所以编译器可以根据情况灵活选择操作数的计算顺序。

论坛徽章:
0
35 [报告]
发表于 2006-11-24 12:03 |只看该作者
到底是先自加还是后自加没有什么讨论的意义吧。一个用了之后不知道会有什么样后果的东西,我们干什么去用呢。干吗不把它分几行写呢,让人看不懂的程序不是好程序,清晰明快的才是好程序。

论坛徽章:
0
36 [报告]
发表于 2006-11-24 12:06 |只看该作者
原帖由 whyglinux 于 2006-11-24 11:58 发表
To 1jjk
>> 但愿我没有误人子弟
>> 把汇编代码扔出来分析分析吧!

误己又误人。C FAQ Question 3.2 中有这么一句话送给你:

(对于这种无定义的表达式,)Don't even try to find out how yo ...



仅仅是说明在这个编译器中是这样,没有说通用吧?
没看我的gcc-3.2.2吗?
再说,如果真写,貌似没有人这么写哦。

补充一下!
是gcc中他是这么运算的(如上面我加的注释),有错误请指出

[ 本帖最后由 1jjk 于 2006-11-24 12:13 编辑 ]

论坛徽章:
0
37 [报告]
发表于 2006-11-24 12:31 |只看该作者
我也感觉是6。
哪位方便的话,给个结果看看啊。

论坛徽章:
0
38 [报告]
发表于 2006-11-24 12:42 |只看该作者
无所谓的,玩玩就可以了,你会这么写吗?
就像明知道
*p="aaaa";
还骗要
p[4]=3一样

你可以挨个换编译器去玩一玩,当学习汇编知识了,呵呵

论坛徽章:
0
39 [报告]
发表于 2006-11-24 13:04 |只看该作者
原帖由 bashenandi 于 2006-11-24 12:31 发表
我也感觉是6。
哪位方便的话,给个结果看看啊。


为了便于理解,对于 (++i)+(++i)+(++i) 这个表达式(i 的初始值为 0),一些可能的计算顺序和结果列举如下:

1. 先对三个 ++i 进行计算,得到 i 的值为 3;三个结果值再相加,结果为 9。

2. 先计算前两个 ++i,得到 i 的值为 2;这两项的结果再相加,得到值 4;计算最后一个 ++i,得到 i 的值为 3;与前两项之和(4)相加,结果为 7。

3. 计算第一个 ++i,得到 i 的值为 1;计算第二个 ++i,得到 i 的值为 2;这两个值相加,得到 3;计算第三项 ++i,得到 i 的值为 3;与前面两项之和 3 相加,最后结果为 6。

……

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-08 06:20:00
40 [报告]
发表于 2006-11-24 13:04 |只看该作者
to  WHYGlinux


1。不好意思:我不是说对于这种“不确定”的表达式有“肯定”的答复
2。 针对此题, 我是“实际”运行的。
3。把三项改为4项相加, 也是实际运行的。(也就是有了11 , 和16的答案)
4。 (++i)+ (++i)+ (++i),在MS studio 2005中运行, 确实是9
   而在GCC中确实是7 。


(是windows版的,没在Solaris上运行过)
我不知道怎么解释各位老大的问题。

[ 本帖最后由 木刀客 于 2006-11-24 13:36 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP