根据官方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
哪一个是正确的?感谢。
答案 0 :(得分:1)
所有的编译器都是对的。
在第
行a = b = a+++a;
您调用了Undefined Behaviour,因为a
被修改了两次而没有干预sequence point。
如果你这样做,C ++标准赋予编译器许可以做他们喜欢的任何事情。