C 阵列中的增量前与增量后

C 阵列中的增量前与增量后,c,post-increment,pre-increment,C,Post Increment,Pre 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 ) ; } 我的理解是,它将把i打印为2,j打印为1,m打印为15 但不知何故,它打印为i为3,j为2和m为

我正在学习编程,我从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打印为2
j打印为1
m打印为15

但不知何故,它打印为
i为3
j为2
m为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.

我的理解有什么错误吗?

你一针见血。你的理解是正确的。增量前表达式和增量后表达式之间的区别听起来很像。预递增意味着在设置或计算表达式之前,变量会递增。后增量表示设置或计算表达式,然后更改变量。很容易将其视为一个两步过程

b = x++;
事实上:

b = x;
x++;
x++;
b = x;

事实上:

b = x;
x++;
x++;
b = x;
编辑:您提供的示例中有一个棘手的部分(这可能会让您感到困惑),即数组索引与其值之间存在巨大差异

i = ++a[1];
这意味着增加存储在[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]++;
还记得我们之前增加了[1],所以现在是2。我们将j=2,然后将其增加到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.

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

因此,最初如果b=5,++b或b++将b的值增加到6。但是,当您使用赋值运算符“=”时,pre和post之间的区别就出现了

所以

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

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步:inta[5]={5,1,15,20,25};变量arr声明为一个大小为5的整数数组,并将其初始化为[0]=5,a[1]=1,a[2]=15,a[3]=20,a[4]=25

第2步:inti,j,m;变量i、j、m被声明为整数类型

第三步:i=++a[1];变成i=++1;因此i=2,a[1]=2

第4步:j=a[1]++;变成j=2++;因此j=2,a[1]=3

m = a[i++];
第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

感谢Eric澄清了疑问,但为什么程序的输出会有所不同?我再次编辑了代码,并对发生的情况进行了详细的细分。我认为这很清楚,如果你需要更多的澄清,请告诉我D感谢Eric的详细理解。