一个空的for循环可以"正确"?

时间:2014-04-24 14:03:46

标签: c for-loop

我对C中的以下代码的for循环有疑问:

main()
{
    int i=1;
    for(;;)
    {
        printf("%d",i++);
        if(i>10)
        break;
    }
}

我在一份试卷中看到了这段代码。我认为for循环不会起作用,因为它没有条件。但答案说代码没有错误。这是真的吗?如果是真的,怎么样?

5 个答案:

答案 0 :(得分:4)

常规for循环有三个部分:

  • 初始化
  • 条件
  • 增量

通常它们是这样写的:

for (initialization; condition; increment) { statements }

但这三个部分都是可选的。在你的情况下,for循环中确实缺少所有部分,但是存在于其他地方

  • 初始化为int i=1
  • 条件为if (i>10) break
  • 增量为i++

上述代码可以等效地写为:

for (int i=1; i <= 10; i++) {
  printf("%d", i);
}

因此,for循环所需的所有部分都存在,除非它们不在实际的for构造中。循环可行,它只是一种非常易读的写入方式。

答案 1 :(得分:2)

for (;;)循环是一个无限循环,但在这种情况下,循环体采取的操作可确保它不会永远运行。控件的每个组件都是可选的。缺失的条件相当于1true

循环可以更清楚地写成:

for (int i = 1; i < 11; i++)
    printf("%d", i);

我们仍然可以辩论输出是否合理:

12345678910

可以通过以下方式更轻松地制作:

puts("12345678910");

你最后得到一个换行符。但这些都是元问题。如上所述,循环“有效”。它在语法上是正确的。它也会终止。

答案 2 :(得分:2)

这是一个无限循环。当for中没有条件且我们使用;;时,for正文中的语句将无限执行。但是因为在它的正文中有一个break语句,如果变量i大于10,则执行将被停止。

正如MSDN中所述:

  

语句for(;;)是产生无限循环的习惯方式,只能通过break,goto或return语句退出。

有关进一步的文档,请查看here

答案 3 :(得分:2)

您没有在for循环中指定任何参数或条件,因此,它将是无限循环。由于存在基于另一个外部变量的中断条件,因此它不会是无限的。

这应该重写为:

for (int i = 1; i <= 10; i++)
    printf("%d",i++);

答案 4 :(得分:0)

即使for循环中没有任何条件,也需要在for循环中指定所需的条件。

printf语句有i++,它继续增加i的值,然后我们有if语句,它将检查i的值是否小于10.一旦i大于10,它将打破循环。