使用“while(true){...}”有什么意义?

时间:2010-10-16 00:23:22

标签: conditional while-loop

为什么有些人在代码中使用while(true){}块?它是如何工作的?

7 个答案:

答案 0 :(得分:8)

这只是一个永远不会结束的循环,称为。 (通常,这是一件坏事。)

当它为空时,它可以无限期地停止程序*;否则循环中通常存在一些条件,当为真时,会打破循环:

while (true)
{
    // ...

    if (stopLoop)
        break;

    // ...
}

这通常比辅助标志更清晰:

bool run = true;
while (run)
{
    // ...

    if (stopLoop)
    {
        run = false;
        continue; // jump to top
    }

    // ...
}

另请注意,由于各种原因,有些人会建议使用for (;;)。 (也就是说,它可能会消除类似于“条件表达始终为真”的警告。)

*在大多数语言中。

答案 1 :(得分:5)

而不是在while语句中填写所有可能的条件,

// Always tests all conditions in loop header:
while( (condition1 && condition2) || condition3 || conditionN_etc ) {

    // logic...

    if (notable_condition)
        continue;  // skip remainder, go direct to evaluation portion of loop

    // more logic
    // maybe more notable conditions use keyword: continue
}

有些程序员可能认为最好将条件放在逻辑上(即不仅仅是在循环标题内)并使用break语句在适当的位置出去。这种方法通常会否定原来的条件以确定何时离开循环(即代替何时保持循环)。

// Always tests all conditions in body of loop logic: 
while(true) {

    //logic...

    if (!condition1 || !condition2)
        break;  // Break out for good. 

    // more logic...

    if (!condition3)
        break;

     // even more logic ...
}

在现实生活中,它通常是一种灰色混合物,是所有这些事物的组合,而不是以某种方式走向两极分化。

用法将取决于逻辑的复杂性和程序员的偏好......也许取决于该线程的接受答案:)

另外,请不要忘记do .. while。最终解决方案可以使用该版本的while构造来扭曲条件逻辑。

do {
    //logic with possible conditional tests and break or continue 
} while (true); /* or many conditional tests */

总之,作为程序员有选择权很好。所以不要忘记感谢您的编译器作者。

答案 2 :(得分:4)

这是一个无限循环。在每次迭代时,将评估条件。由于条件是true,它始终是...... true ...循环将永远运行。退出循环是通过检查循环内部的某些内容,然后在必要时中断。

通过将断点检查放在循环中,而不是将其用作条件,这可以使您更清楚地知道在某些事件发生之前它会运行。

使用它的一个常见场景是游戏;你想继续处理动作和渲染帧,直到游戏退出。

答案 3 :(得分:3)

Edsger W. Dijkstra年轻时,这相当于:

         Do loop initialization
 label a:
         Do some code
         If (Loop is stoppable and End condition is met) goto label b
                     /* nowadays replaced by some kind of break() */
         Do some more code, probably incrementing counters
         go to label a
 label b:
         Be happy and continue

Dijkstra决定成为Antigotoist,并说服大批程序员这样做之后,一种宗教信仰降临到地球上,并且代码的真实性显而易见。

所以

 Do loop initialization
 While (true){
    some code
    If (Loop is stoppable and End condition is met) break();
    Do some more code, probably incrementing counters
 }
 Be happy and continue

取代了憎恶。

对此不满意,狂热分子超越了。一旦证明递归更好,更清晰,更通用的循环,并且变量只是一个恶魔般的化身,功能编程作为一个梦想,实现了:

 Nest[f[.],x, forever[May God help you break]]   

所以,循环递归变得非常不可阻挡,或者至少是不可证实的停止。

答案 4 :(得分:2)

while(条件){做功能} 当条件为真时......它将执行该功能。

所以虽然(真实) 条件总是如此 它会继续循环。

编码永远不会进行。

答案 5 :(得分:1)

这是一个永远运行的循环,除非在体内某处有break语句。

答案 6 :(得分:1)

while(true){..}的真正要点是当退出条件的语义没有强烈的单一偏好时,所以很好的方式对读者说,“好吧,实际上有条件A,B, C ..,但条件的计算过于冗长,因此它们按照预期的出现概率独立地放入内部块中。“