请解释一下为什么最后一个printf给出值11? 我真的不明白为什么会这样。 当a = 10时,条件不满足,为什么这个值变为11? 检查条件后立即增加?
int main(void) {
int a = 0;
while(a++ < 10){
printf("%d ", a);
}
printf("\n%d ", a);
return 0;
}
1 2 3 4 5 6 7 8 9 10
11
答案 0 :(得分:4)
当a++ < 10
等于a
时,让我们看10
。
首先发生的事情是10 < 10
将被评估(为假),然后a
将增加到11
。然后执行printf
循环之外的while
语句。
当++
出现在变量的右侧时,它就是在线上评估的最后一件事。
尝试将a++ < 10
更改为++a < 10
,重新运行代码并比较结果。
答案 1 :(得分:3)
后增量运算符在执行语句之后递增变量的值。
我们举一个例子,
int k = 5 ;
printf("%d\n", k++ );
printf("%d", k );
将输出
5
6
因为在第一个printf()
中显示输出,只有在此之后,该值才会递增。
所以,让我们来看看你的代码
while(a++ < 10)
它会检查a < 10
然后再增加a
。
让我们转到循环中的几次迭代。
当a
为9
时,while循环检查9 < 10
然后将a
递增到10,因此您将获得该迭代的输出为10,同样,对于下一次迭代,它将检查10 < 10
但是while循环不会执行,但a
的值会增加到11
,因此,在下一个printf()
中,输出为11
。
答案 2 :(得分:2)
让我们看一段更简单的代码来展示a++
的作用。
int a = 0;
int b = a++;
printf("%d %d\n", a, b);
我认为您希望输出1 1
。实际上,它会输出1 0
!
这是因为a++
的作用。它会增加a
的值,但表达式a++
的值是a
的初始预递增值。
如果我们想把我的答案顶部的初始代码写成多个语句,它实际上会被翻译成:
int a = 0;
int b = a;
a = a + 1;
printf("%d %d\n", a, b);
我们可以访问的另一个增量是预增量。不同之处在于表达式++a
的值是a
增加后的值。
答案 3 :(得分:1)
因为它的后增量。编译器将首先通过a<10
评估a
和THEN增量1
。