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 条回复
frankzeng
2015-02-10 10:35:03 +08:00
各位别不服气,去大公司应聘,笔试不就考这些吗
Narcissu5
2015-02-10 10:39:47 +08:00
我记得C语言对这种带副作用的表达式的求值和传值顺序是未定义的

so,出现什么结果都有可能,就不要深究啦
itsasony
2015-02-10 10:46:38 +08:00
@jasonding
1+2+3+4
Dongdong36
2015-02-10 11:30:41 +08:00
不需要知道为什么,因为没人会写这种代码,如果想知道原理,就拆分开,一点点试验,分析编译器的处理顺序,不同的编译器对于未定义的操作处理方法是不同的,曾经就遇到过gcc和VS的编译结果不同。
BGLL
2015-02-10 11:39:08 +08:00
@frankzeng 有公司敢考这玩意(认真的考),当场走,这公司没救了
BGLL
2015-02-10 11:43:12 +08:00
@jasonding 楼主的题是C\C++,
C\C++里第一步 a=(++a)+(++a) 可以等于3也可以等于4,看编译器,因为这是未定义行为(也就是错误写法)
等于4的顺序是
++a , a =1了
++a,a=2了
a+a,2+2=4了
b821025551b
2015-02-10 11:46:02 +08:00
这是谭浩强书上的作业吧?
clino
2015-02-10 11:55:58 +08:00
为什么我用gcc编译不过呢

t.c:3:1: warning: data definition has no type or storage class [enabled by default]
a = (++a) + (++a) + (++a) + (++a);
^
t.c:3:1: error: redefinition of ‘a’
t.c:2:5: note: previous definition of ‘a’ was here
int a = 0;
^
t.c:3:1: error: initializer element is not constant
a = (++a) + (++a) + (++a) + (++a);
^
t.c:4:8: error: expected declaration specifiers or ‘...’ before string constant
printf("%d\n", a);
^
t.c:4:16: error: expected declaration specifiers or ‘...’ before ‘a’
printf("%d\n", a);
^
kofj
2015-02-10 11:56:28 +08:00
表示Golang直接syntax error: unexpected ++
xuyuanp
2015-02-10 12:04:14 +08:00
谭浩强教的
rushcheyo
2015-02-10 12:10:55 +08:00
@vzch 伪 vczh 是不是很好玩?
frankzeng
2015-02-10 12:34:56 +08:00
@BGLL 虽然不是这题,但也差不多啊

int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
说实在的,在程序中用这种奇技淫巧,保证不打死他
ceclinux
2015-02-10 12:49:24 +08:00
以前觉得懂这个很牛逼

现在看这种无聊的代码就想吐
msg7086
2015-02-10 12:50:47 +08:00
@frankzeng 4个语句的结果都是undefined。
robertlyc
2015-02-10 13:26:19 +08:00
@frankzeng 说明你真的没去过大公司
josephok
2015-02-10 13:49:21 +08:00
undefined
belin520
2015-02-10 13:57:07 +08:00
哈哈,楼主被喷的,,连谭浩强也跟着躺枪了。。
BGLL
2015-02-10 13:57:10 +08:00
@frankzeng
这已经不是奇巧淫技了,是错误写法了,如果有题目是要指出这个是错误的还可以理解。
要求值那肯定是出题人自己连 C\C++ 的顺序点、副作用是什么都不知道。
本身就是错的语句,考什么?考想象力?这题4个语句都是未定义语句,可以让a等于任何整数值,完全取决于编译器作者心情。
fannas
2015-02-10 14:28:25 +08:00
@谭浩强
b821025551b
2015-02-10 14:33:24 +08:00
@belin520 作为一个曾经的全日制本科生,可以告诉你这道题就是在谭浩强的书上出来的,我还清楚的记得当时用java和c运行出两种结果,屁颠颠地去问个老教授,得到的回复是java就得10,C就得11,没有为什么;再之后用vc和devC又出了两种结果,再然后我那门课挂掉了。。。

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

https://tanronggui.xyz/t/169679

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

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

© 2021 V2EX