我的朋友获得的输出与我在以下程序中输出的输出不同:
int main() {
int x = 20, y = 35;
x = y++ + x++;
y = ++y + ++x;
printf("%d%d", x, y);
return 0;
}
我正在使用Ubuntu,并尝试过使用gcc和clang。我从两者中得到5693
。
我的朋友正在使用Visual Studio 2015,并获得5794
。
我得到的答案(5693
)对我来说最有意义,因为:
x = x + y
(x = 20+35 = 55
)(注意:x
已递增,但已分配到顶部,因此无关紧要)y
已增加,因此为36
y
(y = 37 + 56 = 93
)56
和93
,因此输出为5693
如果在作业之后发生了后期增量,我可以看到VS答案有意义。是否有一些规范使得其中一个答案比另一个更正确?它只是含糊不清吗?我们应该解雇任何编写这样代码的人,使歧义无关紧要吗?
注意:最初,我们只尝试使用gcc,但clang会发出此警告:
coatedmoose@ubuntu:~/playground$ clang++ strange.cpp
strange.cpp:8:16: warning: multiple unsequenced modifications to 'x' [-Wunsequenced]
x = y++ + x++;
~ ^
1 warning generated.
答案 0 :(得分:1)
Clang警告暗示了标准C ++ 11及更高版本中的一个子句,它使得对同一个标量对象执行两次未经测序的修改成为未定义的行为。 (在该标准的早期版本中,规则虽然在精神上相似但却有所不同。)
所以答案是规范使所有可能的答案同样有效,包括程序崩溃;它本质上是模棱两可的。
顺便说一句,在这种情况下,Visual C ++实际上确实有一些一致和逻辑行为,即使标准不需要它:它首先执行所有预增量,然后执行算术运算和赋值,然后最终执行所有在进入下一个语句之前的后增量。如果您浏览了您已经提供的代码,您将看到Visual C ++的答案就是您对此过程的期望。