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呢?
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呢?
1
felix021 Nov 19, 2013 月经贴,关键词“序列点。
|
2
darasion Nov 19, 2013 这个本身就是不确定的,编译器爱怎么实现就怎么实现。
|
3
frogs Nov 19, 2013 这种问题最好的办法是看生成的汇编gcc -S。不过谁要是写这种代码真是该打。
|
4
10iii Nov 19, 2013
楼主钻牛角尖了.
|
5
ranomex Nov 19, 2013 这个问题没有讨论的价值,也没有深究的价值。不同的编译器的实现不同,相同的编译器的不同版本的结果也不同。
你要真问个为什么的话,只能说他编译器乐意这么处理。 最后,给你看个链接 http://gynvael.coldwind.pl/?id=372 |
6
LetFoxRun Nov 19, 2013
无定义行为。
|
9
txx Nov 20, 2013
又是这种奇葩的东西...当初老师留了一道这样题....vc6 vs2012 clang gcc 结果基本上都不一样...
|
10
vietor Nov 20, 2013
各个编译器的编译规则都不太一样,不必纠结这种级别的东西,避免这种写法就行了。
|
11
xgdyhaiyang Nov 20, 2013
|
12
bombless Nov 21, 2013
undefined behavior……
在你想要了解这样一个表达式会有什么值的时刻你就输了…… |
13
isaced Nov 21, 2013
也别怪楼主,那些考试神马的都是这样的题,无奈~
|
14
leavic Nov 21, 2013
把GCC的优化级别改成0试试,或者给C加上volatile属性。
|
15
zonyitoo Nov 21, 2013
这种程序的答案就是「不知道」,因为这个行为是由编译器决定的。
|
16
sgissb1 Nov 21, 2013
lz你这个代码属于没有意义的行为,不仅楼上说的同志们回答的问题都存在。我记得这在C++里面是左右值的问题(不知道C里面有没有),人家写C++的这个组织就没有说左右值的具体优先级啥的,只是说了作用。
而且每每见到这种脑残面试题,我都微微一笑。 在若干年前,记得某X汇这个2b公司确实出了3道这样的题目。但当时也有很多人喜欢出这种题目。 |