数组中的预增量与后增量

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

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

我的理解有什么不对吗?

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

 b = x++; 

是真的:

 b = x; x++; 

 b = ++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]; 

此时我们知道[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之间的差异就会出现。

所以,

 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: int a [5] = {5,1,15,20,25}; 变量arr声明为整数数组,大小为5,初始化为[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