2013-02-14 64 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