2011-03-04 11 views
2
int main() { 
    int a = 10; 
    int b = a * a++; 
    printf("%i %i", a, b); 
    return 0; 
} 

上述代碼的輸出是未定義行爲嗎?C++中的表達式

+0

它是什麼部分(你懷疑是實現相關的)? – quasiverse 2011-03-04 10:20:30

+0

它是未定義的行爲,所以依賴於實現。 – Erik 2011-03-04 10:20:53

+0

@Erik:*未定義行爲*和*實現依賴*是在標準中明確定義的兩個不同的術語。我在某處讀過這篇文章,但現在找不到它。 – 2011-03-04 10:21:55

回答

6

沒有在

int b = a * a++; 

the behavior is undefined,所以結果可以是任何東西 - 這不是「依賴於實現」的意思。

您可能想知道爲什麼它是UB,因爲a僅被修改一次。原因是本標準的5/4段中還有一個要求,即的前值應僅用於確定要存儲的值a只能讀取以確定新值a,但在這裏讀取兩次 - 一次用於計算第一個乘數,並再次計算a++的結果,該結果具有將新值寫入a的副作用。所以即使a在這裏被修改一次,這是未定義的行爲。

+0

它是如何定義的? a在整個表達式被評估後保證遞增。這是一個完全不同的問題,比如++ i = i,這將是實現定義的行爲(評估順序)。在這方面C++與C不同嗎? – Lundin 2011-03-04 10:36:44

+0

@Lundin:我鏈接的問題有一個非常好的最佳答案,它解釋了所有可能的細節 - 我只是不能添加任何內容。 – sharptooth 2011-03-04 10:42:45

+0

是的,我知道這一切。我只是不明白它是如何適用於這種特殊情況。在表達式的末尾有一個序列點,並且有兩個副作用:b被修改,a被修改。每個變量只在序列點結束前修改一次。什麼未定義的行爲被調用和在哪裏? – Lundin 2011-03-04 13:06:37