與++
和--
運營商記住的是,表達具有結果和副作用。 結果的++i
是原始值i
加1
。 副作用的++i
是將1
添加到存儲在i
中的值。
所以,如果i
本來是0
,然後在表達
j = ++i
j
得到的0 + 1
的結果(i
加上1
原始值)。作爲副作用,1
被添加到當前存儲在i
中的值。因此,在評估此表達式後,i
和j
都包含1
。
++
的後綴版本略有不同; 結果的i++
是i
的原始值,但副作用是相同的 - 1
被添加到存儲在i
中的值中。所以,如果i
本來是0
,然後
j = i++;
j
得到的i
(0
)原始值,並1
被添加到存儲在i
值。在此表達之後,j
是0
和i
是1
。
重要 - 沒有指定執行j
的分配和i
的副作用的確切順序。i
確實不是必須在j
被分配之前更新,反之亦然。因此,++
和--
(包括但不限於i = i++
,i++ * i++
,a[i++] = i
和a[i] = i++
)的某些組合將導致未定義的行爲;結果會有所不同,不可預知,具體取決於平臺,優化和周邊代碼。
所以,讓我們想象一下你的對象在內存佈局像這樣:
+---+
a: | 1 | a[0]
+---+
| 2 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | ? |
+---+
j: | ? |
+---+
m: | ? |
+---+
首先,我們評估
i = ++a[1];
的結果++a[1]
是a[1]
加1原值 - 在這種情況下,3
。 副作用用於更新a[1]
中的值。該語句後,你的對象,現在是這樣的:
+---+
a: | 1 | a[0]
+---+
| 3 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | 3 |
+---+
j: | ? |
+---+
m: | ? |
+---+
現在我們執行
j = ++a[1];
同樣的協議 - j
得到的a[1]
加1的值,副作用是更新a[1]
。評估後,我們有
+---+
a: | 1 | a[0]
+---+
| 4 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | 3 |
+---+
j: | 4 |
+---+
m: | ? |
+---+
最後,我們有
m = a[i++];
的i++
結果是3
,所以m
將儲存a[3]
值。副作用是將1
添加到存儲在i
中的值。現在,我們的物品看起來像
+---+
a: | 1 | a[0]
+---+
| 4 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | 4 |
+---+
j: | 4 |
+---+
m: | 4 |
+---+
這不太清楚問題在這裏 - 你觀察到了什麼行爲? –
程序打印4,4,4 我想了解增量是否改變了[1]的實際值,還是隻是爲了定義i,j和m。 另外我不確定在printf中實現的後增量() –
我認爲問題是「註釋是否正確」 – drescherjm