32

我正在学习编程,我是从 C 语言开始的。我在读 Let us 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 1并且m 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.

我的理解有什么问题吗?

4

3 回答 3

64

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

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,然后将它增加为 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.
于 2013-06-01T04:31:40.937 回答
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

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

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  
}

我希望上面的解释可以消除您的疑问以及您正在运行的程序的输出。

于 2013-06-01T04:47:31.697 回答
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 被声明为整数类型。

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

第四步: j = a[1]++;变为 j = 2++; 因此 j = 2 和 a[1] = 3。

第五步: m = a[i++]; 变成 m = a[2]; 因此 m = 15 并且 i 增加 1(i++ 表示 2++ 所以 i=3)

第六步: printf("%d, %d, %d", i, j, m); 它打印变量 i、j、m 的值

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

于 2016-02-08T17:27:36.790 回答