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

时间:2013-07-21 12:42:12

标签: c++ g++ turbo-c++

这是一个初学者问题。

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

请您在逻辑上告诉我输出的原因。

谢谢!

2 个答案:

答案 0 :(得分:3)

输出没有对错。您的代码具有未定义的行为,一切皆有可能。

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

  

除非另有说明,否则评估各个运算符的操作数和个体的子表达式   表达式未被排序。 [注意:在执行期间多次计算的表达式中   一个程序,对其子表达式的无序和不确定顺序的评估不一定​​是   在不同的评估中表现一致。 -end note]一个操作数的值计算   在运算符结果的值计算之前对运算符进行排序。 如果对标量有副作用   对于相同标量对象的另一个副作用或值计算,对象未被排序   使用相同标量对象的值,行为未定义。

在这一行

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

您在标量对象(y--)上引入了两个副作用(分别通过后缀和前缀递增)和两个值计算(--yy的结果)他们没有统治。因此,你的程序是不正确的,几乎任何东西都是可能的输出。

详细了解此here

答案 1 :(得分:0)

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