2017-08-14 82 views
1

打擾業餘主義,但我真的很難理解基本的遞增機制。評論是否正確?初學C語言數組和增量

#include <stdio.h> 

main() 
{ 
int a[5]={1,2,3,4,5}; 
int i,j,m; 
i = ++a[1]; // the value of a[1] is 3. i=3 
j = ++a[1]; /* because of the previous line a[1]=3 
and now a[1]=4? but not in the line defining i? */ 
m = a[i++]; /* i retained the value of 3 even though the value of a[1] has changed 
so finally i++ which is incremented in printf()? */ 
printf("%d, %d, %d", i,j,m);  
} 

我可以回答我自己的問題,但我已經愚弄了很多次瞭解C到目前爲止。

+0

這不太清楚問題在這裏 - 你觀察到了什麼行爲? –

+0

程序打印4,4,4 我想了解增量是否改變了[1]的實際值,還是隻是爲了定義i,j和m。 另外我不確定在printf中實現的後增量() –

+1

我認爲問題是「註釋是否正確」 – drescherjm

回答

3

i = ++a[1]將遞增的a[1]3值和其3將被分配到的i++a[1]結果。

j = ++a[1];將遞增的a[1]4的值和被4將被分配到的j++a[1]結果。

m = a[i++];,將分配的a[3]的值(如i現在3 b)至m其是4i將由1遞增。現在i變成4

3

++--運營商記住的是,表達具有結果副作用結果++i是原始值i1副作用++i是將1添加到存儲在i中的值。

所以,如果i本來是0,然後在表達

j = ++i 

j得到的0 + 1的結果(i加上1原始值)。作爲副作用,1被添加到當前存儲在i中的值。因此,在評估此表達式後,ij都包含1

++的後綴版本略有不同; 結果i++i的原始值,但副作用是相同的 - 1被添加到存儲在i中的值中。所以,如果i本來是0,然後

j = i++; 

j得到的i0)原始值,並1被添加到存儲在i值。在此表達之後,j0i1

重要 - 沒有指定執行j的分配和i的副作用的確切順序。i確實不是必須在j被分配之前更新,反之亦然。因此,++--(包括但不限於i = i++,i++ * i++,a[i++] = ia[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 | 
    +---+