int main() {
int a = 10;
int b = a * a++;
printf("%i %i", a, b);
return 0;
}
上述代碼的輸出是未定義行爲嗎?C++中的表達式
int main() {
int a = 10;
int b = a * a++;
printf("%i %i", a, b);
return 0;
}
上述代碼的輸出是未定義行爲嗎?C++中的表達式
沒有在
int b = a * a++;
the behavior is undefined,所以結果可以是任何東西 - 這不是「依賴於實現」的意思。
您可能想知道爲什麼它是UB,因爲a
僅被修改一次。原因是本標準的5/4段中還有一個要求,即的前值應僅用於確定要存儲的值。 a
只能讀取以確定新值a
,但在這裏讀取兩次 - 一次用於計算第一個乘數,並再次計算a++
的結果,該結果具有將新值寫入a
的副作用。所以即使a
在這裏被修改一次,這是未定義的行爲。
它是如何定義的? a在整個表達式被評估後保證遞增。這是一個完全不同的問題,比如++ i = i,這將是實現定義的行爲(評估順序)。在這方面C++與C不同嗎? – Lundin 2011-03-04 10:36:44
@Lundin:我鏈接的問題有一個非常好的最佳答案,它解釋了所有可能的細節 - 我只是不能添加任何內容。 – sharptooth 2011-03-04 10:42:45
是的,我知道這一切。我只是不明白它是如何適用於這種特殊情況。在表達式的末尾有一個序列點,並且有兩個副作用:b被修改,a被修改。每個變量只在序列點結束前修改一次。什麼未定義的行爲被調用和在哪裏? – Lundin 2011-03-04 13:06:37
它是什麼部分(你懷疑是實現相關的)? – quasiverse 2011-03-04 10:20:30
它是未定義的行爲,所以依賴於實現。 – Erik 2011-03-04 10:20:53
@Erik:*未定義行爲*和*實現依賴*是在標準中明確定義的兩個不同的術語。我在某處讀過這篇文章,但現在找不到它。 – 2011-03-04 10:21:55