【问题标题】:What's the point of using "while (true) {...}"?使用“while (true) {...}”有什么意义?
【发布时间】:2011-04-26 05:06:28
【问题描述】:

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

【问题讨论】:

  • 因为你想让一个任务一遍又一遍地运行并且没有结束条件,在程序结束的旁边。
  • 这叫做无限循环。也称为加热器。
  • 什么语言? (这个括号只是添加了足够的字符以使 StackOverflow 接受评论——他们有一个愚蠢的规则,即 cmets 必须多于 blah blah 字符。)
  • 我是 Java(这个括号只是添加了足够的字符以使 StackOverflow 接受评论——他们有一个愚蠢的规则,即 cmets 必须多于 blah blah 字符。)

标签: conditional while-loop


【解决方案1】:

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

所以当(真) 条件始终为真 它将继续循环。

编码永远不会继续。

【讨论】:

  • 编码可能会继续,但如果不退出循环(比如使用break;),处理将永远不会在循环外继续。
  • 我的意思是.. 如果他不使用任何关键字来打破循环,它将继续在那里循环。
【解决方案2】:

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

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

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 ..,但是条件计算太长,所以按照预期出现概率的顺序独立放入内部块中”。

        【讨论】:

          猜你喜欢
          • 2011-04-14
          • 2011-01-16
          • 2021-02-07
          • 2013-12-25
          • 2023-03-14
          • 2014-05-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多