int main()
{
int var = 1;
var += ++var;
cout<<var;
return 0;
}
在Java中,如預期的那樣,它將輸出3,但是在C++(上面)中它會輸出4.爲什麼?爲什麼這個程序輸出4,而不是3?
int main()
{
int var = 1;
var += ++var;
cout<<var;
return 0;
}
在Java中,如預期的那樣,它將輸出3,但是在C++(上面)中它會輸出4.爲什麼?爲什麼這個程序輸出4,而不是3?
因爲這是未定義的行爲。您正在修改和訪問同一個變量而沒有中間順序點,因此結果取決於編譯器。如果你編譯這個鏗鏘,你會看到:
unsequenced modification and access to 'var'
我實際上得到4的答案,但它同樣可以是3,7,123125123或「龍蝦」。
我不會認爲「龍蝦」具有相同的可能性......但是指出:-) –
只是爲了進一步解釋:'var + = ++ var'被指定爲與var = var ++ ++相同var',所以序列的問題將是「在var + ++ var'中,首先評估哪一邊?」如果先評估左側,那麼當我們評估左側時var不會增加。如果首先評估右側,那麼左側將隨着我們評估它的時間而增加。 Java說表達式從左到右進行評估。 C++沒有指定順序,而是說具有此歧義的代碼沒有任何定義的行爲。 – bames53
@SeanBright很多小狗都會因爲我們的學習目的而受苦,那麼= \ –
我不認爲我在任何情況下都曾經見過'var + = ++ var;' – celeriko
Java有明確的語義來評估這樣的表達,所以你得到的結果在那裏是可預測的,就像你注意到的那樣。 C++(或C)根本就不是這種情況。 – Mat