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?能分析一下吗?

3589 次点击
所在节点    C
68 条回复
hooluupog
2015-02-10 14:39:41 +08:00
Go直接报错~~
onemoo
2015-02-10 14:42:50 +08:00
楼上很多人都说了,这个行为是undefined。
用这几个关键字去google吧:副作用(side effect)、序列点(sequence point)

虽然是未定义的,但如果你想知道你的gcc是用什么样的实现来得到这个结果的 ,请查看汇编:objdump -d
Mysdes
2015-02-10 14:50:54 +08:00
@vzch 嗯,这头像看起来和轮子小哥有点像。

facat
2015-02-10 14:55:23 +08:00
标准里面没有规定++运算符的优先级,是编译器自己实现的。
lalalanet
2015-02-10 14:59:22 +08:00
@facat 是这样的,这是分标准表达式,每个编译器怎么处理都是随意的。这种代码写出来就是找死。
BGLL
2015-02-10 15:05:31 +08:00
@b821025551b
难怪,那么多人喷谭浩强....
onlyice
2015-02-10 15:27:15 +08:00
求不问这种问题。。
自己搜一下就知道了。。
vwok
2015-02-10 20:02:20 +08:00
对于扯这种问题的,可以把四个括号去掉让他在算算等于多少

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

https://tanronggui.xyz/t/169679

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

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

© 2021 V2EX