数组中的前置递增和后置递增

35

我正在学习编程,从C语言开始。我正在阅读《让我们一起学C语言》这本书,并且在浏览其中的一个程序。

main( ) 
{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( "\n%d %d %d", i, j, m ) ; 
}

我的理解是,它将打印i为2j为1m为15

但不知何故,它却打印为i为3j为2m为15?为什么会这样呢?

以下是我的理解-

b = x++;
In this example suppose the value of variable ‘x’ is 5 then value of variable ‘b’ will be 5 because old value of ‘x’ is used.

b = ++y;
In this example suppose the value of variable ‘y’ is 5 then value of variable ‘b’ will be 6 because the value of ‘y’ gets modified before using it in a expression.

我对理解是否有误,还请指教。

3个回答

67

你说得很对,理解正确。前置和后置递增表达式的区别就像它听起来的那样。前置递增意味着在表达式被设置或评估之前变量会递增。后置递增意味着表达式被设置或评估后,变量会被改变。这很容易想象成一个两步过程。

b = x++;

真正的含义是:

b = x;
x++;

并且

b = ++x;

真正的意思是:

x++;
b = x;

编辑:您提供的示例中棘手的部分(可能让您感到困惑)是数组索引和其值之间有很大的区别。

i = ++a[1];

这意味着将存储在a [1]中的值增加,然后将其设置为变量i。

m = a[i++];

这个意思是将m设置为a[i]的值,然后增加i的值。两者之间的差别非常大,初学者可能会感到困惑。

第二次编辑:代码细节

{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( "\n%d %d %d", i, j, m ) ; 
}

首先:

i = ++a[1];

此时我们知道a[1] = 1(请记住数组的索引从零开始)。但我们首先将其增加。因此i = 2。

j = a[1]++;

记得我们之前已经将a[1]增加了一次,所以它当前的值为2。我们设置j=2,然后再将j增加到3。因此,现在j=2且a[1]=3。

m = a[i++];

我们知道i = 2。所以我们需要设置m = a[2],然后增加i。在这个表达式的结尾,m = 15,i = 3。

总之,

i = 3, j = 2, m = 15.

感谢Eric澄清了疑问,但为什么程序的输出结果会不同呢? - user2442489
我再次编辑了代码,并详细解释了正在发生的事情。我认为这很清楚,如果您需要更多澄清,请告诉我。 :D - Eric Wich
感谢Eric的详细理解。 - user2442489

5

你的理解不完全正确。前缀递增和后缀递增运算符是一元运算符。

因此,如果初始值为b = 5,则++b或b++将b的值增加到6。然而,当使用赋值运算符“=”时,前缀和后缀之间的差异就出现了。

所以,

if b=5
a=b++ // after this statement a=5 and b=6 as it is post increment
c=++b // after this statement c=7 and b=7

为了更好的理解,您可以将上述内容分为以下几点:

a=b;  
b=b+1; //post increment  
b=b+1; //pre increment  
c=b;`  

所以,您给出的例子是:
main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;  
 i = ++a[1] ; // a[1] = 2 and i = 2  
 j = a[1]++ ; // j = 2 and a[1] = 3  
 m = a[i++] ; // m = a[2++] = 15, i now becomes 3  
 printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15  
}

为了清晰起见,我将上述代码拆分成多个语句:

main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;
 a[1] = a[1] + 1;  
 i = a[1];  
 j = a[1];  
 a[1] = a[1] + 1;  
 m = a[i]; // m = a[2] = 15  
 i = i + 1;  
 printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15  
}

我希望上述的解释能够消除你的疑虑,并且让你理解程序的输出。

1

解释:

步骤1: int a[5] = {5, 1, 15, 20, 25}; 变量arr被声明为一个大小为5的整数数组,并初始化为a [0] = 5,a [1] = 1,a [2] = 15,a [3] = 20,a [4] = 25。

步骤2: int i,j,m; 变量i,j,m被声明为整数类型。

步骤3: i = ++a [1]; 变成了i = ++1; 因此i = 2并且a [1] = 2

步骤4: j = a [1]++; 变成了j = 2 ++; 因此j = 2并且a [1] = 3。

步骤5: m = a [i ++]; 变成了m = a [2]; 因此m = 15并且i增加了1(i ++表示2 ++,因此i = 3)

步骤 6: printf("%d, %d, %d", i, j, m); 它打印变量 i、j 和 m 的值。

因此程序的输出是 3,2,15


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接