2017-08-14 55 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 | 
    +---+