【问题标题】:Effect of semicolon after 'for' loop'for'循环后分号的效果
【发布时间】:2012-11-05 11:05:22
【问题描述】:

假设我想使用 for 循环在 C 语言中打印五次消息。为什么如果我像这样在 for 循环之后添加分号:

for (i=0;i<5;i++);

消息没有被打印 5 次,但如果我不把分号放在那里,它会打印?

【问题讨论】:

    标签: c loops for-loop


    【解决方案1】:

    分号是一个合法的语句,称为 null 语句 *,意思是“什么都不做”。由于for 循环执行单个操作(可能是包含在{} 中的块),因此分号被视为循环的主体,从而导致您观察到的行为。

    以下代码

     for (i=0;i<5;i++);
     {
         printf("hello\n");
     }
    

    解释如下:

    • 重复五次for (i=0;i&lt;5;i++)
    • ...什么都不做(分号)
    • 为局部变量{打开一个新范围
    • ...打印“你好”
    • 关闭范围}

    如您所见,重复的操作是;,而不是printf


    * 参见K&R,第 1.5.2 节

    【讨论】:

    • 分号不是“运算符”。它终止一个“语句”,并且该语句不包含任何内容是有效的。一些编译器对此提出警告,因为这是一个常见错误。空括号{} 是什么都不做的首选方式。
    • 分号是标点符号,但不是操作符
    • @ams 请查看编辑。我把它称为运算符是错误的,它是一个声明(至少根据 K&R)
    • @ouah 请查看编辑。我把它称为运算符是错误的,它是一个声明(至少根据 K&R)
    • @SergeyKalinichenko 有重复的人,也有重复的人。 :-)
    【解决方案2】:
    for (i=0;i<5;i++);
    

    等价于

    for (i=0;i<5;i++){}
    

    【讨论】:

      【解决方案3】:

      仅由 ; 标记组成的语句称为 null 语句,它只是……什么都不做。

      例如,这是有效的:

      void foo(void)
      {
           ;
           ;
           ;
      } 
      

      它可以在任何可以使用语句的地方使用,例如:

      if (bla)
          ;
      else
          ;
      

      参见 C 标准段落:

      (C99, 6.8.3p3) "空语句(仅由分号组成)不执行任何操作。"

      【讨论】:

        【解决方案4】:

        下面的代码将打印“Hello”5次..

            for(i=0;i<5,printf("Hello\n");i++);
        

        【讨论】:

        • 其实不会打印Hello 5次;它将无限次打印 Hello 。这是因为条件是i &lt; 5, printf("Hello\n");,并且逗号运算符评估其 LHS (i &lt; 5) 并忽略结果,然后评估 RHS (printf("Hello\n")),它返回 6,因为它将 6 个字符写入标准输出;因为 6 为真(它不为零),所以循环无限期地继续。使用 GCC 的默认编译器选项(包括 -Werror),代码无法编译:error: left-hand operand of comma expression has no effect [-Werror=unused-value]
        【解决方案5】:

        当您在 for 循环后放置分号时,许多编译器会显示语法错误,但根据 gcc 编译器 (Linux) 或 Dev-cpp,您可以在 for 循环后放置分号,它不会显示任何错误。

        例如

        for(int i=0;i<=5;i++);
        

        for(int i=0;i<=5;i++) 
        {//blank body}
        

        从上面的例子可以清楚地看出,如果我们在 for 循环之后放置空括号或分号,这意味着我们还没有输入任何变量。

        现在来回答您的问题。
        如果你想打印 hello 5 次,你必须把你的程序写成

        for(int i=0;i<5;i++)
        {
            printf("hello");
        }
        

        希望你能理解
        干杯!!
        拉胡尔·瓦希斯特

        【讨论】:

          【解决方案6】:
          #include <stdio.h>
              
          int main() {
              int sum = 0; // variable initialization  
              int k = 1;  
              //for(int i = 1; i <= 10; i++);
              {
                  sum = sum + k;  
                  k++;
              }  
              printf("The  value of sum is %d", sum);  
              return 0;
          }
          

          如果for循环后面有分号,则花括号中的代码将被视为常规体,将正常执行。

          在上面的程序中,我注释了for 循环,它与将; 放在for 循环的末尾做同样的事情。它将总和打印为1,因为花括号内的代码执行一次。

          【讨论】:

          • '{' 与注释的 for 循环内联。这就是它没有编译的原因。请立即尝试使用更新的代码。
          【解决方案7】:

          当 for 循环体只包含单个语句时,不需要在 for 循环体周围使用花括号 {}

          for(i=0; i<5; i++)
          {
              printf("Napoleon");
              printf("Bonaparte");
          }
                
          for(j=0; j<5; j++)
              printf("Napoleon");
          

          所以for(j=0; j&lt;5; j++); 将自己评估为

          for(j=0; j<5; j++)
              ;
          

          所以这是一个带有单个语句的 for 循环,即 ; 空语句。 null 语句什么都不做。当循环运行 5 次时,null 语句会执行 5 次,但它没有按照定义执行任何操作。

          【讨论】:

            【解决方案8】:

            它的功能与:

            for(i=0;i

            这里大括号内没有任何内容,只会将 i 的值增加到 5。 您可以在下一行使用 print 语句检查这一点并得到 i=5。

            `Compiled code ss here!!!

            【讨论】:

            • 不要重复上面给出的相同答案。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-12
            • 2022-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多