使用“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) ...”有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

在代码中使用 while True

java中的while(true)语句的用法是啥

迭代和递归有啥区别?

使用 volatile long 有啥意义吗?

使用嵌套迭代器有啥意义吗?

通过引用传递使用 const 有啥意义? C++ [重复]