2013-10-31 51 views
-1

運行此操作時,我發現輸出爲:4 4.無法理解原因。無法理解在C/C++中使用++ i的輸出

int i = 2; 
printf("%d %d", ++i, ++i); 
+0

一個函數在其參數被評估之前不能被調用,可以嗎? –

+2

@ R.MartinhoFernandes:不,但是在應用其參數表達式的副作用之前,其參數的值可以設置爲石頭,因爲唯一的序列點在*評估之後是*,而在*函數調用之前。因此,對於這個代碼,'3 3','3 4','4 3'和'4 4'都是模糊的輸出,儘管它有未定義的行爲,所以任何事情都是允許的。 –

回答

4

你所經歷的是Undefined behavior。請閱讀有關順序點。逗號是函數調用中的分隔符,不是操作符。

一個序列點是一個時間點,在這個時間點,塵埃已經沉澱,並且迄今爲止看到的所有副作用都保證完成。在C標準中列出的序列的要點是:

在一個完整表達式(全 表達式是一個表達式語句,或任何其他表達這 不是任何更大的表達式內的子表達式的評估的端部); at ||,& &,?:和逗號運算符;和 在一個函數調用(在評估所有參數之後,並且在實際調用之前)。

標準指出

之前和下一序列點之間的對象應具有由表達式的評估修飾的至多一次其 存儲的值。 此外,只有在訪問先前值時才能確定要存儲的值。