2013-02-14 67 views
-1

根据官方C++标准,有人能解释为什么在使用不同编译器运行时,以下简单代码的输出存在差异?编译器差异在g ++ 4.7.2和Intel 13.0.1与clang ++ 3.2和g ++ 4.8

换句话说,没有标准的离开这个开放的,以第一次会发生什么,在一个++或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锵++ 3.2你:

stdout: 
a = 21, b = 21 

哪一个是正确的?谢谢。

+11

恭喜!你是第一百万人在stackoverflow上问这个问题:)! – us2012 2013-02-14 13:22:52

+0

@ US2012 +1让我笑:) – 2013-02-14 13:25:29

+2

所有的编译器是正确的,但是你错了对编译器警告与'-Wall',这将节省您的时间问这个问题不转动。去班级后面 – 2013-02-14 13:30:26

回答

1

所有的编译器是正确的。

在行

a = b = a+++a; 

调用Undefined Behaviour,因为a得到中间没有sequence point修改了两次。 如果你这样做了,C++标准给了编译器许可证来做任何他们喜欢的事情。

+0

好的,我们有什么b = a +++ a; 会是这样吗? – UpGM 2013-02-14 13:40:56

+0

@UpGM - 是的。绝对没有理由写这样的代码。只需使用'b = 2 * a; ++ a;'或'b = 2 * a + 1; ++ a;',无论你想要什么结果。 – 2013-02-14 13:47:22

+0

@BoPersson我只是为了更好地理解差异而问,并不是我会在某处写这样的代码。谢谢! – UpGM 2013-02-14 14:55:35