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

tru*_*ktr 1 conditional while-loop

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

GMa*_*ckG 8

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

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

while (true)
{
    // ...

    if (stopLoop)
        break;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

另请注意for (;;),由于各种原因,有些人会建议.(也就是说,它可能会消除类似于"条件表达总是如此"的警告.)

*在大多数语言中.

  • 这不是"停顿",而是"快速旋转到位". (3认同)

Mic*_*sen 5

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

通过将中断检查放置在循环中,而不是将其用作条件,可以更清楚地表明您希望此检查在某个事件发生之前一直运行。

在游戏中经常使用这种方式。您要继续处理动作并渲染帧,直到游戏退出。


Joh*_*n K 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
}
Run Code Online (Sandbox Code Playgroud)

一些程序员可能认为最好将条件放在逻辑上(即不仅仅是在循环头内)并使用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 ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

另外不要忘了do.. while.最终的解决方案可以使用该版本的while构造来根据自己的喜好扭曲条件逻辑.

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

总而言之,拥有程序员选项是件好事.所以不要忘记感谢您的编译器作者.

  • 我更喜欢`do {...} while(false);`;) (3认同)
  • 做...而(假)是穷人的男人 (2认同)
  • @trusktr:"while(x){...}"循环中的"continue"语句将重新评估条件."for(x; y; z){...}"循环中的"continue"语句将执行"z"操作并重新评估条件."do {...} while(x);"中的"continue"语句 循环将重新启动循环而不评估条件. (2认同)