-1

根据官方 C++ 标准,有人可以解释为什么以下简单代码在使用不同的编译器运行时会出现不同的输出吗?

换句话说,标准是否对首先发生的事情保持开放,a++ 或 b 赋值?

这与函数参数无关,它是在不同编译器上运行的同一段代码。这是示例代码:

#include <iostream>
using namespace std;

int main() {
    int a = 10, b;

    a = b = a+++a;
    cout << "a = " << a << ", b = " << b;

return 0;
}

代码链接在这里

使用g++ 4.7.2Intel C++ 13.0.1,您可以获得:

stdout:
a = 21, b = 20

而使用g++ 4.8.0Clang++ 3.2你会得到:

stdout:
a = 21, b = 21

哪一个是正确的?谢谢。

4

1 回答 1

1

所有的编译器都是正确的。

在行

a = b = a+++a;

您调用未定义的行为,因为a在没有中间序列点的情况下被修改了两次。如果你这样做,C++ 标准会授予编译器许可来做他们喜欢的任何事情。

于 2013-02-14T13:27:10.897 回答