2012-12-05 104 views
11

可能重複:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
increment values in printf在C/C++爲x [I] *值Y [i ++]總是等於x [I] * Y [I]

我有兩個雙數組xy和整數i。我的問題是,是否聲明:

double res = x[i] * y[i++]; 

總是等於聲明:

double res = x[i] * y[i]; 
i++; 

有沒有可能是某些編譯器會改變x[i] * y[i++]y[i++] * x[i],這顯然會產生不同的結果?

+0

爲什麼這很重要?如果你想要一個特定的訂單,只需按照這個順序寫。 –

+0

@BoPersson。我想解釋爲什麼我需要它,但不想破壞這個問題。不久,我需要加速'double vectors_dot_product(double * x,double * y,int n);'函數,並發現'x [i] * y [i ++] + x [i] * y [i ++] +。 ..;'比'x [i] * y [i] + x [i + 1] * y [i + 1] + ...快;' – Serg

回答

13

否 - x[i] + y[i++]有未定義的行爲。您正在修改i的值,並且還使用值i而沒有中間順序點,這會給出未定義的行爲。


  1. 在C++ 11標準已經消除了「序列點」的術語,但效果是一樣的 - 兩個是無序相對於彼此。
+1

+1正確語言的第一個答案。 – slebetman

+3

這與乘法運算符的交換性無關。如果操作是'x [i] - y [i ++]'(這是不可逆轉的),那麼在這種情況下'i'的行爲仍然是不確定的。 –

8

不,增量發生時未定義。

+8

不僅僅當增量出現時。行爲**完全**未定義:它修改'i'並讀取它的值而沒有介入序列點。 –

+1

@佩特:太好了,比薩餅送貨員什麼時候會出現在我家門口? ;) – fredoverflow

+2

@FredOverflow - 詢問你的編譯器廠商。 –

1

否,

值的我+ + + i ++在在CC++undefined

如果您在表達式中同時讀取兩次變量並且寫入它時,結果是未定義的。不要這樣做。另一個例子是:

v[i] = i++; 

未定義表示其編譯器依賴。
某些編譯器可能會因爲評估順序而警告您未定義。 一個非常好的reference用於C++

1http://www.stroustrup.com/bs_faq2.html#evaluation-order

+0

仍然需要一點工作 - 'v [i] = i ++;'是未定義的,儘管它可能不涉及任何函數或傳遞參數。 –

+0

@GrijeshChauhan,謝謝你的鏈接。 – Serg

+0

@Serg:歡迎serg!我很高興如果我可以幫助:) –

6

的代碼修改i和使用它的值而沒有插入序列點,所以該行爲是未定義。語言定義在這裏沒有強制要求。

+0

有趣的是,在所有人中,你不會提到C++ 11不再使用「序列點」的事實。 :-) –

+0

@JerryCoffin - 有時候最好讓事情簡單些。 –

+0

+1。對於「放棄信仰,所有進入這裏的人們」這種簡單的說法,都有一些話要說。 –

相關問題