【问题标题】:Post Increment in while loop in C在 C 中的 while 循环中发布增量
【发布时间】:2014-10-21 17:13:55
【问题描述】:

这是一个非常简单的 C 程序:

int main()
{
    int i = 0;
    while(i++ < 10)
         printf("%d\n", i);

    return 0;
}

结果是:

1
2
3
4
5
6
7
8
9
10

为什么0 不是第一个打印的数字? 如果我用++i 替换i++,我会得到这个:

1
2
3
4
5
6
7
8
9

对于i++++i,第一个数字是1
我希望看到 0 在 while 循环 while() 中进行后期增量。
谢谢。

【问题讨论】:

  • i++ 在执行时间上是递增的,当然是一个。
  • 不管使用什么运算符,你打印i修改后,你怎么能看到0!?
  • while(i++ &lt; 10) /*i is incremented here*/ printf("%d\n", i);
  • C 程序员出于某种原因喜欢对 SO 投反对票,这就像 C 不是有史以来最令人困惑的语言。

标签: c while-loop post-increment pre-increment


【解决方案1】:

i++(和++i)是作为while 表达式评估的一部分完成的,它发生在打印之前。这意味着它最初总是会打印1

i++++i 变体之间的唯一区别是增量发生在表达式本身内部,这会影响打印的最终值。每个的等效伪代码是:

while(i++ < 10)            while i < 10:
                               i = i + 1
    printf("%d\n", i);         print i
                           i = i + 1

和:

                           i = i + 1
while(++i < 10)            while i < 10:
    printf("%d\n", i);         print i
                               i = i + 1

假设i 上升到9。对于i++ &lt; 10,它使用9 &lt; 10 表示while 表达式然后 在打印前将i 递增到10。所以检查使用 9 然后打印 10。

使用++i &lt; 10,它首先递增i 然后使用10 &lt; 10 表示while 表达式。所以检查使用 10 并且 打印任何内容,因为循环已因该检查而退出。

【讨论】:

    【解决方案2】:

    i++后增量++i前增量。后自增是指对象自增后返回前一个值。预增量是指对象自增然后返回。无论哪种方式,对象在计算其表达式时都会递增,这就是为什么您不会将0 作为第一个输出。

    【讨论】:

      【解决方案3】:

      在检查之后和打印之前增加i。检查和打印后增加,或使用do while 循环:

      int main()
      {
          int i = 0;
          do {
              printf("%d\n", i);
          } while(i++ < 10);
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        当 while 循环 while(i++ &lt; 10) 被评估时,它会检查 i 的值,将其加一,并将 old 值与 10 进行比较。当您将其更改为 while(++i &lt; 10) 时,它会递增i 在将新值与 10 进行比较之前的值。

        无论如何,当您进入下一条语句时,i 已经递增。

        如果你想从 0 打印到 9,你可以试试

            while(i < 10)
             printf("%d\n", i++);
        

        相反。在这种情况下,i 的值在 将其原始值提供给 printf 语句之后递增。

        【讨论】:

          【解决方案5】:

          whie 循环是检查条件是否为真执行 while 块并测试

          条件为假时终止while循环。

          查看 while 循环中的后增量 ++

          void main()

          {

          int rmvivek;

          clrscr();

          printf("请输入 1 到 10 的整数");

          scanf("%d",&rmvivek);

          while(10>= rmvivek++)

          {

          printf("值为=%d\n", rmvivek);

          }

          get();

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-07
            • 2018-06-26
            • 2016-04-22
            • 2022-01-18
            • 1970-01-01
            • 2016-12-27
            相关资源
            最近更新 更多