C++代码在不同的编译器中显示不同的输出,这是出乎意料的

C++ Code displays different, which is unexpected, output in different compilers

本文关键字:出乎意料 输出 编译器 代码 C++ 显示      更新时间:2023-10-16

这是一个初学者的问题。

以下是我使用的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

当使用Code::Blocks在Windows上编译时(使用带有GCC/G++的MinGW),显示的输出如下:

5,3,4,3

以前,我听说有时不同的编译器对某些问题的表现不同,但我不明白为什么会显示这个结果。因为从逻辑上讲,正如我所认为的,输出应该是:

5,3,5,3

你能从逻辑上告诉我这样输出的原因吗。

谢谢!

没有正确或错误的输出。您的代码有未定义的行为,任何事情都是可能的。

原因在于C++标准第1.9.15段(n3337)(强调矿):

除非另有说明,否则单个运算符的操作数和单个运算符的子表达式的求值表达式是无序列的[注意:在执行过程中多次求值的表达式中对于一个程序,其子表达式的无序列和不确定序列的求值不需要在不同的评估中始终如一地执行--尾注]在运算符的结果的值计算之前对运算符进行排序如果标量上有副作用对象相对于同一标量对象上的另一个副作用或值计算未排序使用相同标量对象的值,行为是不确定的

在这一行

cout << y-- << "," << --y;

您已经在未排序的标量对象(y)上引入了两个副作用(分别以后缀和前缀递增)和两个值计算(y----y的结果)。因此,您的程序格式不正确,几乎任何东西都是可能的输出。

点击此处了解更多信息。

cout<<y--<<","<<--y;是一个在y上具有两个未排序副作用的表达式,因此具有未定义的行为。