【发布时间】:2015-08-12 02:22:27
【问题描述】:
我从几篇类似What are all the common undefined behaviours that a C++ programmer should know about? 的帖子中了解到,该行为未定义并留给编译器。
但是对于给定的代码,输出是2 1 3(总是,始终如一)
#include<stdio.h>
int main(){
int i = 1;
printf("%d %d %d\n", i++, i++, i);
return 0;
}
所以,我想知道,gcc 遵循什么顺序,看起来不像从左到右或从右到左?输出总是相同的,这个问题只与 gcc 4.9.1 编译器有关。
【问题讨论】:
-
如果你想知道 gcc 为这个特定的运行做了什么,请查看程序集输出(使用
-S开关)。请记住,这可能随时发生变化,尤其是当您更改编译器开关或使用不同的编译器或在程序的其他任何地方进行更改时。 -
“始终如一”?真的吗?即使我们将自己限制为编译器的单个特定版本,您确定您测试了所有可能的编译器设置组合吗?周围环境的所有可能变体呢?如果你不这样做,你怎么能做出“始终如一”的主张?
-
无论如何,是什么让您认为它是故意遵循某个命令,而不是出于计算机程序的原始自然原始决定论无意中产生相同的命令?
-
我玩了一下这个。我将调用“A”“
i++”和“B”“i”。所以printf("%d %d %d\n", i++, i++, i)是“AAB”。好的?AAAB是3214。AAAAB是 43215。AAABAB是 432515。AAAABAABAB是7654321818。规则似乎是从右到左执行所有操作,同时执行替换,然后替换任何变量。我没有任何野心去确定。 -
我投票决定将此问题作为题外话结束,因为它要求仅对一个版本的 gcc 解释 UB。对于 SO 访问者,我认为这没有持久的价值。如果有人想调查 UB,他们应该自己做。