【发布时间】:2017-01-30 11:57:29
【问题描述】:
当我用 gcc 编译这段代码并运行时
int a=1;
printf("%d",(a=a+1)+(a=a+1)+(a=a+1));
我希望结果是 2+3+4=9,但输出是 10。
我知道 (++a)+(++a)+(++a) 中存在未定义的行为,因为可以在评估所有 (++a) 之前运行三个 ++ 副作用。
但我认为a=a+1 的值正是a 在评估分配后的值。所以编译器不能先处理三个a=a+1,然后将变量a中的值作为a=a+1的值,毕竟a=a+1被评估了。
我想根据c标准知道哪里错了。
【问题讨论】:
-
代码没有实际用处。序列点等
-
我正在研究编译器,我想知道编译器是如何按照c标准工作的
-
“但我认为 a=a+1 的值正是 a 在赋值后的值。”为什么你这么想?为什么这与
++a有什么不同? (提示:不是。) -
@rici 你不认为必须对这种意外行为做出解释吗?
-
a=a+1中的每一个都可以顺序或并行或两者兼而有之。缺少序列点会导致结果模棱两可。
标签: c expression undefined-behavior sequence-points