为什么有些人在代码中使用while(true){}
块?它是如何工作的?
答案 0 :(得分:8)
这只是一个永远不会结束的循环,称为infinite-loop。 (通常,这是一件坏事。)
当它为空时,它可以无限期地停止程序*;否则循环中通常存在一些条件,当为真时,会打破循环:
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 ..,但条件的计算过于冗长,因此它们按照预期的出现概率独立地放入内部块中。“