我正在学习编程,我从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 2
,j as 1
和m as 15
但不知怎的,它打印为i as 3
,j as 2
和m 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.
我的理解有什么不妥吗?
答案 0 :(得分:28)
你击中了头部的钉子。你的理解是正确的。前后增量表达式之间的区别就像听起来一样。预增量意味着在设置或计算表达式之前递增变量。增量后意味着设置或评估表达式,然后改变变量。很容易将其视为一个两步过程。
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.
答案 1 :(得分: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
}
我希望上面的解释能够清除您对所运行程序的疑问和输出。
答案 2 :(得分:1)
<强>解释强>
第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(&#34;%d,%d,%d&#34;,i,j,m);它打印变量i,j,m
的值因此该程序的输出为3,2,15