数组中的预增量与后增量

21 c pre-increment post-increment

我正在学习编程,我从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 ) ; 
}
Run Code Online (Sandbox Code Playgroud)

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

但不知何故,它打印为 i as 3,j as 2m as 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.
Run Code Online (Sandbox Code Playgroud)

我的理解有什么不对吗?

Eri*_*ich 34

你击中了要害.你的理解是正确的.前后增量表达式之间的区别就像听起来一样.预增量意味着在设置或计算表达式之前递增变量.增量后意味着设置或评估表达式,然后改变变量.很容易将其视为一个两步过程.

b = x++;
Run Code Online (Sandbox Code Playgroud)

是真的:

b = x;
x++;
Run Code Online (Sandbox Code Playgroud)

b = ++x;
Run Code Online (Sandbox Code Playgroud)

是真的:

x++;
b = x;
Run Code Online (Sandbox Code Playgroud)

编辑:您提供的示例中的棘手部分(可能会让您失望)是数组索引与其值之间存在巨大差异.

i = ++a[1];
Run Code Online (Sandbox Code Playgroud)

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

m = a[i++];
Run Code Online (Sandbox Code Playgroud)

这意味着将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 ) ; 
}
Run Code Online (Sandbox Code Playgroud)

第一:

i = ++a[1];
Run Code Online (Sandbox Code Playgroud)

此时我们知道[1] = 1(记住数组是零索引).但我们先增加它.因此i = 2.

j = a[1]++;
Run Code Online (Sandbox Code Playgroud)

记住我们之前递增了a [1],所以它当前是2.我们设置j = 2,然后将它增加到3.所以j = 2,现在a [1] = 3.

m = a[i++];
Run Code Online (Sandbox Code Playgroud)

我们知道i = 2.所以我们需要设置m = a [2],然后递增i.在该表达式的末尾,m = 15,并且i = 3.

综上所述,

i = 3, j = 2, m = 15.
Run Code Online (Sandbox Code Playgroud)


Kar*_*nha 5

你的理解并不完全正确.预增量和后增量运算符是一元运算符.

所以,最初如果b = 5,则++ b或b ++将b的值增加到6.但是,当使用赋值运算符"="时,pre和post之间的差异就会出现.

所以,

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
Run Code Online (Sandbox Code Playgroud)

为了清楚理解,您可以将上述陈述划分为:

a=b;  
b=b+1; //post increment  
b=b+1; //pre increment  
c=b;`  
Run Code Online (Sandbox Code Playgroud)

那么,你给出的例子:

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  
}
Run Code Online (Sandbox Code Playgroud)

为清楚起见,我将上面的代码拆分成多个语句:

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  
}
Run Code Online (Sandbox Code Playgroud)

我希望上面的解释清除你怀疑和你正在运行的程序的输出.