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

2015-02-09 23:10:21 +08:00
 igboy
int a = 0; 
a = (++a) + (++a) + (++a) + (++a);
printf("%d\n", a);

gcc version: 4.9.2

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

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

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

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

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

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

© 2021 V2EX