【问题标题】:Why the Semicolon is not emptying the loop body?为什么分号没有清空循环体?
【发布时间】:2017-05-29 18:24:03
【问题描述】:

for 循环末尾的分号是为了清空循环体并创建一个空循环。但是为什么要打印6

void main()
{
    int i;
    for(i=1;i<=5;i++);
    {
        printf("%d\n",i);
    }
}

【问题讨论】:

  • 它使空循环(什么都不做),但它确实将i 增加到6,因此在循环结束后执行下一个打印语句
  • 你可能想问为什么只打印一个数字而不是 5,或者你真的没有得到循环。
  • 如果说以分号结束的空语句是循环体会更准确一些。这不是分号的某种特殊情况或神奇意义。它只是创建了一个 for 循环,其 body 什么都不做,但它在所有方面都像任何其他 for 循环一样工作。
  • 你有一个循环。你期待什么?
  • @zubergu 不,我知道循环,我在问为什么它现在打印 6。

标签: c for-loop


【解决方案1】:

循环体为空,否则将打印12345。但是循环头仍然运行,并且在每次迭代中它都会增加i。当它到达不是&lt;=56 时,循环结束。在循环将i 打印为6 之后打印i。递增i 是循环的副作用。

【讨论】:

    【解决方案2】:

    它是。在循环结束时,i 将是 6,而 printf 会这样做。

    【讨论】:

      【解决方案3】:

      for 循环 for(i=1;i&lt;=5;i++); 将运行 5 次,将 i 从 1 递增到 6(即使 for 循环体是空操作)。因此,在这里:

      {
          printf("%d\n",i);
      }
      

      程序将打印i的当前值,即6。

      【讨论】:

        【解决方案4】:

        因为你在空循环之外声明了int,所以值被保存在自增循环之外。

        Read more about it here

        额外的括号在这里没有任何作用,因为分号退出了循环。

        Read more about brackets here.

        【讨论】:

          【解决方案5】:

          试试这个好玩

          #include <stdio.h>
          
          int main(void)
          {
              int i;
              for (i = 1; i <= 5; i++) /* void */;
          
              /* floating block one */
              {
                  int i = 42; /* new i, hides old i */
                  printf("%d\n",i);
              }
          
              /* floating block two */
              {
                  printf("%d\n",i);
              }
          }
          

          【讨论】:

          • 向我解释这个@pmg
          • @Magnus 看到这个 void main() { int i; for(i=1;i
          • 应该打印 42 42,但打印 42 6
          • i 的第二个定义(42)在“浮动”块内创建了一个不同的变量,有效地隐藏了第一个变量(有两个 is,但您可以只能访问最里面)。当该块完成时,另一个“浮动”块从范围内的前一个 i 开始。
          • 怎么找回之前的valuer是“2”?应该换成42吧。
          【解决方案6】:

          很简单:

          for(i=1;i&lt;=5;i++);会被执行5次,从1到5 然后 i=6 结束 for 循环,然后执行新的“作用域”语句:

          printf("%d\n",i);
          

          因此打印 6

          【讨论】:

            猜你喜欢
            • 2014-04-05
            • 1970-01-01
            • 2014-05-07
            • 1970-01-01
            • 1970-01-01
            • 2019-09-16
            • 1970-01-01
            • 2014-12-05
            • 1970-01-01
            相关资源
            最近更新 更多