2013-07-21 29 views
1

這是一個初學者的問題。C++代碼顯示不同的,這是意想不到的,在不同的編譯器中輸出

以下是我與

int main() { 
    int x=5, y=5; 
    cout<<x--; 
    cout<<","; 
    cout<<--x; 
    cout<<","; 
    cout<<y--<<","<<--y; 
    return 0; 
} 

工作時在Turbo C++ 3.0下運行C++代碼的代碼顯示輸出:

5,3,4,4 

當代碼編譯::在Windows塊(使用的MinGW與GCC/G ++)下面是顯示的輸出:

5,3,4,3 

以前,我聽說有時不同的編譯器對某些問題的行爲不同,但我不明白爲什麼會顯示此結果。因爲從邏輯上講,因爲我認爲,輸出應該是:

5,3,5,3 

能否請你告訴我,這樣的輸出的邏輯推理。

謝謝!

+0

[任何人都可以解釋這些未定義的行爲(i = i ++ + ++ i,i = i ++等等)](http:// stackoverflow。com/questions/949433/could-anyone-explain-these-undefined-behaviors -i -i -i -i -i -i) – Casey

+0

@Casey謝謝你指出我的問題。我沒有在搜索結果中找到它,但它確實解釋了很多。 –

+0

Turbo C++ 3.0於1991年發佈,所以它不可能是C99編譯器。 – Spire

回答

3

沒有正確或錯誤的輸出。你的代碼有未定義的行爲,任何事情都是可能的。

原因在於C++的標準(重點煤礦)段15年9月1日(n3337):

除非另有說明,個體經營者和個人 表達式的子表達式的操作數評價是未測序。 [注意:在程序執行 期間多次評估的表達式中,對其子表達式進行的未序列化和不確定序列化評估不需要在不同評估中一致地執行 。 - 結束符]運算符結果的值計算之前,運算符 的操作數的值計算被排序。 如果使用相同標量對象的值相對於標量對象的副作用相對於同一標量對象上的另一副作用或值計算 未被序列化,則行爲未定義。

在這一行

cout << y-- << "," << --y; 

你已經引入了兩個副作用(增量分別由後綴,前綴長度,)和兩個值計算的標量對象(的y----y結果)(y )他們在哪裏不確定。因此,你的程序是不合格的,幾乎任何東西都是可能的輸出。

瞭解更多關於here

+0

謝謝你這麼好的解釋@jork!現在我明白'未定義行爲'的含義。 –

0

cout<<y--<<","<<--y;是一個在y上有兩個不確定副作用的表達式,因此具有未定義的行爲。

+0

+1比自己短。 – jrok

+0

@jrok嘿,夥計 - 你叫什麼名字??? – Casey

+0

你的......................答案。總之,簡而言之,就是簡潔。 – jrok

相關問題