while 循环后的值 post-increment

Value after the while loop with post-increment

请解释为什么最后一个 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 

让我们看看 a++ < 10a 等于 10 时。

将发生的第一件事是 10 < 10 将被评估(为 false),然后 a 将递增到 11。然后执行 while 循环外的 printf 语句。

++ 出现在变量的右侧时,它是该行最后计算的东西。

尝试将 a++ < 10 更改为 ++a < 10,重新运行您的代码,然后比较结果。

因为它是 post-增量。编译器将首先评估 a<10,然后将 a 递增 1

post 递增运算符在语句执行后递增其之前变量的值。

举个例子,

int k = 5 ;
printf("%d\n", k++ );
printf("%d", k );

会输出

5
6

因为在第一个 printf() 中显示了输出,只有在那之后,值才会递增。

所以,让我们看看你的代码

while(a++ < 10)

它检查 a < 10,然后递增 a

让我们在循环中进行几次迭代。

a9 时,while 循环检查 9 < 10 然后将 a 递增到 10,因此您将获得该迭代的输出为 10,并且同样,对于下一次迭代,它将检查 10 < 10 但 while 循环不执行,但 a 的值增加到 11 因此,在你的下一个 printf() ,你得到的输出为 11.

让我们看一段更简单的代码来展示 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 递增后的值。