【问题标题】:Value after the while loop with post-increment带有后增量的 while 循环后的值
【发布时间】:2015-06-17 06:04:37
【问题描述】:

请解释一下为什么最后一个 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=10 不应该增加a?你了解后增量的工作原理吗?
  • @BlueMoon 我认为你的第二个问题的答案很明显,这反过来又回答了第一个问题。
  • 现在是的,谢谢大家的回答,对我来说,即使条件不满足,这个值也会增加,这一点并不明显。
  • @Misiek777 因此,通常建议不要编写像while(a++ &lt; 10) 这样的代码,因为它可能会造成混淆/不清楚,或者至少会让开发人员停下来。

标签: c while-loop post-increment


【解决方案1】:

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

举个例子,

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

会输出

5
6

因为在第一个printf() 中,会显示输出,然后才会增加值。

那么,让我们看看你的代码

while(a++ < 10)

它检查a &lt; 10,然后递增a

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

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

【讨论】:

    【解决方案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】:

      因为它是后增量。编译器将首先评估a&lt;10,然后将a 增加1

      【讨论】:

        【解决方案4】:

        a 等于10 时,让我们看看a++ &lt; 10

        首先会发生10 &lt; 10 将被评估(为假),然后a 将递增到11。然后你在while 循环之外的printf 语句执行。

        ++ 出现在变量的右侧时,它是该行中最后评估的内容。

        尝试将a++ &lt; 10 更改为++a &lt; 10,重新运行代码并比较结果。

        【讨论】:

          猜你喜欢
          • 2011-11-07
          • 2022-01-18
          • 1970-01-01
          • 2013-06-26
          • 2020-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多