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

4411 次点击
所在节点    C
68 条回复
BGLL
2015 年 2 月 10 日
任意两个顺序点之间的副作用的发都是未定义的.
这是未定义行为,a=a++都是未定义行为,是错误的……
ostholz
2015 年 2 月 10 日
llvm 3.5 编译出来的结果是 10
swift 结果也是 10
yellowV2ex
2015 年 2 月 10 日
口算应该是 10 啊
BGLL
2015 年 2 月 10 日
这个编译器应该会有等于
16(4+4+4+4)

11(2+2+3+4)
两种结果
geeti
2015 年 2 月 10 日
谭浩强的书看多了就爱思考这种问题
BGLL
2015 年 2 月 10 日
我说的是 c\c++
第一步:(++a) + (++a)编译器会的当成
++a;(a==1
++a;(a==2
a+a;表达式值==2+2==4
后面就是4+ (++a),楼主应该懂了

这种式子是未定义行为是错误的,要是有题目出这种东西,使劲喷
BGLL
2015 年 2 月 10 日
++a;(a==1
++a;(a==2
a+a;表达式值==2+2==4(a=2
4+ (++a)==4+3==7(a=3
7+(++a)==7+4==11

-
++a;
++a;
++a;
++a;
a+a+a+a==16;
zhsj
2015 年 2 月 10 日
这应该是编译原理的作业吧。。。
xfwduke
2015 年 2 月 10 日
movl $0, 28(%esp)
addl $1, 28(%esp)
addl $1, 28(%esp)
movl 28(%esp), %eax
leal (%eax,%eax), %edx
addl $1, 28(%esp)
movl 28(%esp), %eax
addl %edx, %eax
addl $1, 28(%esp)
addl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf

直接看这个最明了了
msg7086
2015 年 2 月 10 日
语句是非法的,搞懂了也没意义。
ispinfx
2015 年 2 月 10 日
No zuo no die why you try!
invite
2015 年 2 月 10 日
因为规定好了。
chrishine
2015 年 2 月 10 日
很多人默默的B了就行了.
楼主这种的, 要给5个铜币.
yuankui
2015 年 2 月 10 日
这种问题好无聊...
quericy
2015 年 2 月 10 日
这种问题,也就谭++和应试教育喜欢出~~~~
singer
2015 年 2 月 10 日
幸好学的时候,老师说谭浩强的太傻逼,直接换其他书上了。搞得我们全班比其他平行班C语言牛逼好多。只能说别学太死了。。。。能编程,这项目,就好了,不要去纠结没意义的题目啊。
loveuqian
2015 年 2 月 10 日
<script type="text/javascript">
var a = 0;
a = (++a) + (++a) + (++a) + (++a);
document.write(a)
</script>

答案是10喔
jasonding
2015 年 2 月 10 日
研究了下,JAVA这个题的答案是10。
a=(++a) ;
此时a=1
a=(++a)+(++a) : a=1 + (++1)
此时打印结果为3;
a=(++a)+(++a) +(++a) : a=1 + (++1) +(++(1 + (++1)))
此时打印结果为6;
a=(++a)+(++a) +(++a)+(++a) : a=1 + (++1) +(++(1 + (++1)))+(++(1 + (++1) +(++(1 + (++1)))))
此时打印结果为10。
但是11就不知道怎么来的了
jasonding
2015 年 2 月 10 日
打印结果为10那一行写错了,cao
a=(++a)+(++a) +(++a)+(++a) : a=1 + (++1) +(++(1 + (++1)))+(++(++(1 + (++1)))
这样才是对的
robertlyc
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