2014-02-21 71 views
1

實施例代碼* BUF ++ = *的buf + 10 - 最後一個表達式的解釋

int arr[3] = { 0, 1 }; 
int* buf = arr; 
*buf++ = *buf + 10; 

結果是buf[0] == 10。我教過它會是buf[0] == 11

我的一所大學寫了類似於示例代碼的東西,我教它的工作方式與它的不同。我想知道它爲什麼如此運作。

我開始研究它的方法是查看運算符優先級表。它表示後綴++優先於解引用。因此,我教導operator=buf左側會指向第一個元素,但在operator=的右側,它已經增加並指向第二個元素。但事實並非如此。

我的問題是,這是爲什麼?最好是標準報價:)但是歡迎任何解釋!

+6

這裏有一個標準的報價:***未定義的行爲*** * - 這個國際標準沒有要求的行爲* – chris

+5

我不明白爲什麼人們低估這些dups,我不清楚它是這樣輕鬆搜索這類問題。只需投票結束。 –

+4

@ ShafikYaghmour:同意。如果你不知道爲什麼這個行爲是未定義的,你怎麼可能知道在搜索中包含「序列點」這個詞? –

回答

2

您正在單個序列點中多次訪問和修改指針。這是未定義的行爲。

更一般地說,讀取和寫入任何序列點之間的變量是不確定的。你在這個具體例子中有一個指針的事實是由旁邊的。

爲了避免混淆與所述指針:

int i = 0; 
i++ = i + 1; // UB 

在邏輯上,應在右手側上的ii「當前」值,或者修改後的值?這就是爲什麼它是未定義的。相反,分開的代碼:

int i = 0; 
++i; 
i = i + 1; 

這是清楚的,並明確界定。

+0

我必須說我不知道​​在同一個表達式中多次取消引用變量是未定義的行爲。還是僅僅當你將它與修改它同時結合?從我得到的鏈接我只看到在單個表達式中多次修改變量是未定義的行爲。 – rozina

+0

@rozina它是這種情況,它是解引用和修改的組合。一般來說,它只是修改而已。等號右邊的'* buf'具體來說就是這裏的問題(因爲不知道它應該是指針增量之前的值還是之後的值)。 –

+0

我們不要稱之爲「解除引用」,好嗎?在C++中,這意味着非常具體的東西,這不是這個問題的根本,並且導致OP有些混亂。您對序列點的含義也有點困惑 - 它們既不能被「解除引用」,也不能被修改。 –

相關問題