int a = 0; a = (++a) + (++a) + (++a) + (++a);为什么 a 最终等于 11

2015 年 2 月 9 日
 igboy
int a = 0; 
a = (++a) + (++a) + (++a) + (++a);
printf("%d\n", a);

gcc version: 4.9.2

不太懂为什么 a 会等于 11?能分析一下吗?

4405 次点击
所在节点    C
68 条回复
skybr
2015 年 2 月 9 日
别分析了, 写出这种代码的都被打死了.
scusjs
2015 年 2 月 9 日
看看汇编就知道了。。会各种坑爹的优化啥的。ps. 这种代码纯属蛋疼
igboy
2015 年 2 月 9 日
@skybr 程序肯定是不会用这种代码的,但是我只是想知道为什么啊
skybr
2015 年 2 月 9 日
@igboy 没为什么, 看编译器怎么实现, 比如llvm就直接编译报错.
zkd8907
2015 年 2 月 9 日
分析的结果就是如果我们的团队里有人写这种代码直接Failed Code Review。。
46fo
2015 年 2 月 9 日
谁吃饱了 写这样的代码
Do
2015 年 2 月 9 日
这代码应该是体育老师教的
Sharuru
2015 年 2 月 9 日
看汇编代码+1
编译器实现+1
Po 主可以搜索有关 C语言和自增运算的相关文章,简单来说结果完全是看编译器是怎么实现的。
LMkillme
2015 年 2 月 9 日
我特想知道,开这种题目先河的是不是谭浩强?
vzch
2015 年 2 月 9 日
@LMkillme 咱记得绿色封面第三版是有这类题的
txx
2015 年 2 月 9 日
这种题 不同编译器 结果不同 不同参数 结果不同
disonlee
2015 年 2 月 9 日
同楼上,编译器不同,结果不同的。写这代码明显是小白装大神。
hjc4869
2015 年 2 月 9 日
楼主,VC2013和C#里这个结果都是16。各自都有各自的解释,这种代码出现在现实生活中就是一个字:死。
igboy
2015 年 2 月 9 日
@skybr
@scusjs
@zkd8907
@xdeng
@Do
@Sharuru
@LMkillme
@vzch
@txx
@disonlee
感谢诸位,直接去反汇编,看汇编代码了
vibbow
2015 年 2 月 9 日
PHP给的结果是 10
spacewander
2015 年 2 月 10 日
不如我们试试看,不同的编译器/编程语言会得出一共多少种答案?;)
LMkillme
2015 年 2 月 10 日
@spacewander 编译器还那么多版本呢。。。要不都测一遍?我支持你~
adjusted
2015 年 2 月 10 日
这种还是要做过编译器的专业人士来解释
acros
2015 年 2 月 10 日
两点明白了就好:
前置自增运算符的特点,
“+”运算符的结合方向 (这个好像不同编译器表现不一样?)
jsq2627
2015 年 2 月 10 日

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

https://v2ex.ih06.com/t/169679

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

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

© 2021 V2EX