g ++ 4.7.2和Intel 13.0.1与clang ++ 3.2和g ++ 4.8的编译器差异

时间:2013-02-14 13:21:33

标签: c++ compiler-construction g++ clang intel

根据官方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;
}

代码链接为here

使用 g ++ 4.7.2 英特尔C ++ 13.0.1 ,您将获得:

stdout:
a = 21, b = 20

使用 g ++ 4.8.0 Clang ++ 3.2 时,您会得到:

stdout:
a = 21, b = 21

哪一个是正确的?感谢。

1 个答案:

答案 0 :(得分:1)

所有的编译器都是对的。

在第

a = b = a+++a;

您调用了Undefined Behaviour,因为a被修改了两次而没有干预sequence point。 如果你这样做,C ++标准赋予编译器许可以做他们喜欢的任何事情。