使用“while (true) ...”有啥意义?
Posted
技术标签:
【中文标题】使用“while (true) ...”有啥意义?【英文标题】:What's the point of using "while (true) ..."?使用“while (true) ...”有什么意义? 【发布时间】:2011-04-26 05:06:28 【问题描述】:为什么有些人在他们的代码中使用while(true)
块?它是如何工作的?
【问题讨论】:
因为你想让一个任务一遍又一遍地运行并且没有结束条件,在程序结束的旁边。 这叫做无限循环。也称为加热器。 什么语言? (这个括号只是添加了足够的字符以使 *** 接受评论——他们有一个愚蠢的规则,即 cmets 必须多于 blah blah 字符。) 我是 Java(这个括号只是添加了足够的字符以使 *** 接受评论——他们有一个愚蠢的规则,即 cmets 必须多于 blah blah 字符。) 【参考方案1】:while(条件)执行函数 当条件为真时..它将执行该功能。
所以当(真) 条件始终为真 它将继续循环。
编码永远不会继续。
【讨论】:
编码可能会继续,但如果不退出循环(比如使用break;
),处理将永远不会在循环外继续。
我的意思是.. 如果他不使用任何关键字来打破循环,它将继续在那里循环。【参考方案2】:
这只是一个永远不会自行结束的循环,称为infinite-loop。 (通常情况下,这是一件坏事。)
当它为空时,它会无限期地停止程序*;否则循环中通常会有一些条件,当它为真时,会中断循环:
while (true)
// ...
if (stopLoop)
break;
// ...
这通常比辅助标志更干净:
bool run = true;
while (run)
// ...
if (stopLoop)
run = false;
continue; // jump to top
// ...
另请注意,出于各种原因,有些人会推荐for (;;)
。 (也就是说,它可能会消除类似于“条件表达式始终为真”的警告。)
*在大多数语言中。
【讨论】:
与其说是“停止”,不如说是“快速原地旋转”。 @Jeremy:公平。 :) 除非我将“暂停”定义为“不执行超出while
循环范围的语句”,否则我将保持原样。 :P【参考方案3】:
这是一个永远运行的循环,除非在主体内部某处有 break
语句。
【讨论】:
【参考方案4】:这是一个无限循环。在每次迭代中,都会评估条件。因为条件是true
,它总是……真……循环将永远运行。退出循环是通过检查循环内部的东西来完成的,然后在必要时中断。
通过将中断检查放在循环中,而不是将其用作条件,这可以更清楚地表明您希望它一直运行到某个事件发生。
使用它的常见场景是在游戏中;您想继续处理动作并渲染帧,直到游戏退出。
【讨论】:
【参考方案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 */
总之,作为一名程序员,有很多选择真是太好了。所以不要忘记感谢你的编译器作者。
【讨论】:
我更喜欢do ... while (false);
;)
信不信由你,Hitachi 实际上在其硬盘驱动器中使用了do ... while (false);
循环。
@drachenstern:“做 ... while(0);”如果一个语句内部同时包含“break”和“continue”语句,则语句可能具有有用的循环语义。仅当没有执行 break 或 continue 语句时,才会执行最后一个 break 或 continue 之后的语句部分。一个“做 ... while(0);”与“breaks”一起使用但不与“continue”一起使用的语句也可能是 if/elseif 链的有用替代方案,后者需要在每个“else”和随后的“if”之间使用一个或多个语句。
哦,好的,明白了!将继续;”强制程序跳过任何剩余的逻辑并评估 while 条件?
@trusktr:“while(x)...”循环中的“continue”语句将重新评估条件。 “for(x;y;z)...”循环中的“继续”语句将执行“z”操作并重新评估条件。 “do...while(x);”中的“continue”语句loop 将在不评估条件的情况下重新启动循环。【参考方案6】:
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]]
因此,loops 递归变得真正不可停止,或者至少不可证明地可停止。
【讨论】:
【参考方案7】:while (true) .. 的真正意义在于退出条件的语义没有强烈的单一偏好,所以它很好地告诉读者,“嗯,实际上有中断条件 A、B、 C ..,但是条件计算太长,所以按照预期出现概率的顺序独立放入内部块中”。
【讨论】:
以上是关于使用“while (true) ...”有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章