“for(;;)”是什么意思?

44
在 C/C++ 中,以下内容是什么意思?
for(;;){
    ...
}

14
永远单身的循环。 - Swiss
请参考以下链接:https://dev59.com/sFHTa4cB1Zd3GeqPRW-O#4031654 和 https://dev59.com/4XE85IYBdhLWcg3whD3k#2737623 。虽然它们是PHP / Perl的,但我并没有将它们视为重复,但如果这个问题以前没有被问过,我会很惊讶。不过,因为我找不到C语言相关的问题,所以你现在是安全的 :-) - paxdiablo
我没想到我会是第一个提问的人,但在提问之前我尝试过搜索。没有关键词可以搜索,我承认我有点懒。 - sas4740
没问题,我们喜欢这种类型的问题!这就像赛跑一样,争取最先按下答案按钮。 - Marlon
3
我建议使用 for(;"ever";) { code } 的代码。 - Viktor Sehr
也可以使用for(;true;){/*代码*/} - D. Sikilai
5个回答

52

这是一个无限循环,相当于 while(true)。当没有提供终止条件时,条件默认为false(即循环不会终止)。


16
人们写for(;;)而不是while(true)的原因是因为一些编译器会对while(true)中的常量布尔表达式发出警告。例如,Visual C++会在使用while(true)时给出“warning C4127: conditional expression is constant”的警告提示。 - In silico
3
从功能来看,它完全相同。 - Justin Morgan
2
@In silico:如果你喜欢高尔夫,它也短了四个字符。 - Anon.
2
我认为另一个原因是有些人认为这样更易读。 - Marlon
摩根:有一个Stack Overflow问题与Visual C++编译器相关,涉及到for(;;)while(true)的区别。 - In silico
另外没有提到的一件事是,使用while()会强制编译器在每次迭代时检查值,而for(;;)更快,因为它不会这样做。 - ForceMagic

17

在 C 和 C++ (以及很多其他编程语言中),for 循环有三个部分:

  • 一个前置循环部分,在循环开始之前执行;
  • 一个迭代条件部分,只要条件为真,循环体就会执行;
  • 一个后置迭代部分,在每次循环体迭代后都会执行。

例如:

for (i = 1, accum = 0; i <= 10; i++)
    accum += i;

将从1加到10(包括10)的数字相加。

大致等同于以下内容:

i = 1;
accum = 0;
while (i <= 10) {
    accum += i;
    i++;
}

然而,并没有什么要求for语句中的循环体必须包含任何内容,如果迭代条件缺失,它将被视为true。

所以for(;;)循环基本上意味着:

  • 不执行任何循环设置;
  • 无限循环(即使有breaks、returns等也是如此);和
  • 不进行任何后迭代处理。

换句话说,这是一个无限循环。


8

循环直到循环内部执行某些 breakexitthrow等语句。基本上,你可以认为一个 for 循环由以下组成:

for (setup; test; advance)
    ...

如果“test”为空,则被视为true,循环将继续运行。 空的“setup”和“advance”仅仅不执行任何操作。

6
一个无限循环,直到出现 break, exit, 或者 goto 语句才会结束。

3
即使这个答案建议两种语法结构是等价的,但在C语言(可能依赖于编译器)中,for(;;)while(1)(都创建了无限循环)之间有微妙的区别。
例如,某些编译器(如Windriver DIABData)在使用while(1)时会抱怨“条件始终为真”。
改用for(;;)可以摆脱警告,这可能是因为后者表达意图更强,故意创建无限循环,并且根本没有“始终为真”的条件(而且写起来更短)。
另一方面,C++语言不对这两种结构进行区分,正如Adrian在评论中所述:
C++标准规定,缺少条件使隐含的while子句等效于while(true)for(for-init-statement condition opt; expression opt)语句等效于{ for-init-statement while(condition) { statement expression; } }

C++ 语言标准中,第 [stmt.for] 节明确规定 缺少条件将使隐含的 while 子句等效于 while(true),并且 for ( for-init-statement condition opt ; expression opt ) statement 等价于 { for-init-statement while ( condition ) { statement expression ; } }。总之,我们得出 for(;;) 等同于 while(true)。由于您编写了 while(1),这可能仅适用于 C,而不是 C++ - Adrian W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接