一个C语言问题

2013-11-19 22:18:55 +08:00
 smilngwang
int b=1,c=1,d,e;

d=(b++)+(++b);
e=(c++)+(c++)+(++c);

d=4
e=7
arm上d=4,e=7,用的编译器是arm公司的armcc

gcc的结果d=e=4


gcc为什么d和e的值都是4呢?
1693 次点击
所在节点    C
16 条回复
felix021
2013-11-19 22:28:03 +08:00
月经贴,关键词“序列点。
darasion
2013-11-19 22:28:35 +08:00
这个本身就是不确定的,编译器爱怎么实现就怎么实现。
frogs
2013-11-19 22:29:39 +08:00
这种问题最好的办法是看生成的汇编gcc -S。不过谁要是写这种代码真是该打。
10iii
2013-11-19 22:32:23 +08:00
楼主钻牛角尖了.
ranomex
2013-11-19 23:12:14 +08:00
这个问题没有讨论的价值,也没有深究的价值。不同的编译器的实现不同,相同的编译器的不同版本的结果也不同。
你要真问个为什么的话,只能说他编译器乐意这么处理。
最后,给你看个链接
http://gynvael.coldwind.pl/?id=372
LetFoxRun
2013-11-19 23:34:28 +08:00
无定义行为。
hackingwu
2013-11-19 23:38:41 +08:00
@LetFoxRun
@10iii 我只想知道编译器会怎么处理会得到那个4的值。
10iii
2013-11-20 00:40:06 +08:00
@hackingwu 真想知道就看汇编吧。
txx
2013-11-20 01:44:20 +08:00
又是这种奇葩的东西...当初老师留了一道这样题....vc6 vs2012 clang gcc 结果基本上都不一样...
vietor
2013-11-20 10:50:34 +08:00
各个编译器的编译规则都不太一样,不必纠结这种级别的东西,避免这种写法就行了。
xgdyhaiyang
2013-11-20 10:55:40 +08:00
建议看一下这个PPT
http://www.slideshare.net/olvemaudal/deep-c
关键词:副作用、序列点
bombless
2013-11-21 07:39:21 +08:00
undefined behavior……
在你想要了解这样一个表达式会有什么值的时刻你就输了……
isaced
2013-11-21 09:45:13 +08:00
也别怪楼主,那些考试神马的都是这样的题,无奈~
leavic
2013-11-21 16:37:06 +08:00
把GCC的优化级别改成0试试,或者给C加上volatile属性。
zonyitoo
2013-11-21 22:08:10 +08:00
这种程序的答案就是「不知道」,因为这个行为是由编译器决定的。
sgissb1
2013-11-21 23:38:47 +08:00
lz你这个代码属于没有意义的行为,不仅楼上说的同志们回答的问题都存在。我记得这在C++里面是左右值的问题(不知道C里面有没有),人家写C++的这个组织就没有说左右值的具体优先级啥的,只是说了作用。

而且每每见到这种脑残面试题,我都微微一笑。

在若干年前,记得某X汇这个2b公司确实出了3道这样的题目。但当时也有很多人喜欢出这种题目。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/89848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX