1

这是一个初学者的问题。

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

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

谢谢!

4

2 回答 2

3

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

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

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

在这一行

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

您已经在标量对象 ( ) 上引入了两个副作用(分别按后缀和前缀递增)和两个值计算(y--和的结果),其中它们是无序的。因此,您的程序格式错误,几乎任何东西都是可能的输出。--yy

在此处阅读有关此内容的更多信息。

于 2013-07-21T13:24:04.120 回答
0

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

于 2013-07-21T13:19:38.730 回答