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

3518 次点击
所在节点    C
68 条回复
BGLL
2015-02-10 00:32:35 +08:00
任意两个顺序点之间的副作用的发都是未定义的.
这是未定义行为,a=a++都是未定义行为,是错误的……
ostholz
2015-02-10 00:33:42 +08:00
llvm 3.5 编译出来的结果是 10
swift 结果也是 10
yellowV2ex
2015-02-10 00:34:12 +08:00
口算应该是 10 啊
BGLL
2015-02-10 00:44:53 +08:00
这个编译器应该会有等于
16(4+4+4+4)

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

这种式子是未定义行为是错误的,要是有题目出这种东西,使劲喷
BGLL
2015-02-10 01:05:19 +08:00
++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;
zsj950618
2015-02-10 01:10:36 +08:00
这应该是编译原理的作业吧。。。
xfwduke
2015-02-10 02:02:33 +08:00
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-02-10 04:04:35 +08:00
语句是非法的,搞懂了也没意义。
ispinfx
2015-02-10 08:17:36 +08:00
No zuo no die why you try!
invite
2015-02-10 08:45:48 +08:00
因为规定好了。
chrishine
2015-02-10 08:52:46 +08:00
很多人默默的B了就行了.
楼主这种的, 要给5个铜币.
yuankui
2015-02-10 09:09:53 +08:00
这种问题好无聊...
quericy
2015-02-10 09:12:24 +08:00
这种问题,也就谭++和应试教育喜欢出~~~~
singer
2015-02-10 09:24:51 +08:00
幸好学的时候,老师说谭浩强的太傻逼,直接换其他书上了。搞得我们全班比其他平行班C语言牛逼好多。只能说别学太死了。。。。能编程,这项目,就好了,不要去纠结没意义的题目啊。
loveuqian
2015-02-10 09:36:29 +08:00
<script type="text/javascript">
var a = 0;
a = (++a) + (++a) + (++a) + (++a);
document.write(a)
</script>

答案是10喔
jasonding
2015-02-10 09:53:51 +08:00
研究了下,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-02-10 09:56:15 +08:00
打印结果为10那一行写错了,cao
a=(++a)+(++a) +(++a)+(++a) : a=1 + (++1) +(++(1 + (++1)))+(++(++(1 + (++1)))
这样才是对的
robertlyc
2015-02-10 10:20:04 +08:00
没啥 为什么
编译器就是这么做的 而且各家编译器还不同

不需要理解 除非你未来工作是写/优化编译器

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

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

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

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

© 2021 V2EX