[英]C++ Code displays different, which is unexpected, output in different compilers
这是一个初学者的问题。
以下是我正在使用的C ++代码
int main() {
int x=5, y=5;
cout<<x--;
cout<<",";
cout<<--x;
cout<<",";
cout<<y--<<","<<--y;
return 0;
}
在Turbo C ++ 3.0中运行时,以下是代码显示的输出:
5,3,4,4
在Windows上使用Code :: Blocks编译时(使用MinGW和GCC / G ++),以下是显示的输出:
5,3,4,3
以前,我听说有时不同的编译器对某些问题的行为有所不同,但我不明白为什么会显示这个结果。 从逻辑上讲,我认为输出应该是:
5,3,5,3
你能否从逻辑上告诉我这样输出的原因。
谢谢!
输出没有对错。 您的代码具有未定义的行为,一切皆有可能。
原因在于C ++标准的第1.9.15(n3337)段(强调我的):
除非另有说明, 否则对单个运算符的操作数和单个表达式的子表达式的评估是不确定的。 [注意:在程序执行期间不止一次评估的表达式中,不需要在不同的评估中一致地执行对其子表达式的未序列和不确定顺序的评估。 -end note]运算符操作数的值计算在运算符结果的值计算之前排序。 如果相对于相同标量对象的另一个副作用或使用相同标量对象的值的值计算,对标量对象的副作用未被排序,则行为未定义。
在这一行
cout << y-- << "," << --y;
你已经引入了两个副作用(分别通过后缀和前缀递增)和两个值计算( y--
和--y
结果)在标量对象( y
)上,它们是y--
--y
。 因此,你的程序是不正确的,几乎任何东西都是可能的输出。
在这里阅读更多相关信息。
cout<<y--<<","<<--y;
是一个表达式,对y
有两个无序的副作用,因此具有未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.