2014-02-13 29 views
-2

這是從一個笑話開始的:這個表達式是否調用未定義的行爲?

訪問者:C和C++有什麼區別?
候選人:ONE

我的問題是表達abs(C++ - C)abs(C - C++)是否調用未定義的行爲或不?

+0

這不僅是未定義的,而且還未指定的行爲,因爲未指定子表達式的評估順序。 –

回答

3

是的,這是未定義的行爲。如果在語句中重複使用相同的變量,編譯器將不會對增量何時發生作出任何承諾。

+0

如果'C'具有內置類型,那麼這只是未定義的行爲。否則,它只是未指定的(並且具有有限的可能值集合 - 假設用戶定義'operator ++'是確定性的)。 –

4

這取決於C類型,但在最好的(用戶定義 類型,其中++是一個函數),這是未指定的 第二C是否之前或 C.operator++評價後進行評價。

當然,對於內置型,所述表達是不確定的 行爲,以及用於用戶定義類型,最後的結果將 也取決於用戶如何定義operator++,以及所述 編譯器相關的順序的評估。

0

是的,這是UB。從C99,第6.5節

表達式是符和操作數,指定的值

除以後指定的 計算(對於函數調用(),& &的序列,|| ?:,和 逗號運營商),子表達式的評估順序和 順序副作用發生均爲未指定

因此,在執行後增量時,快遞C++ - C中無法保證。

相關問題