【问题标题】:Why use infinite loops?为什么要使用无限循环?
【发布时间】:2008-10-22 01:56:18
【问题描述】:

另一位发帖人询问preferred syntax for infinite loops

一个后续问题:为什么您在代码中使用无限循环?我通常会看到这样的构造:

for (;;) {
  int scoped_variable = getSomeValue();
  if (scoped_variable == some_value) {
    break;
  }
}

这让您可以避免在forwhile 子句中看到 scoped_variable 的值。 “无限”循环还有哪些其他用途?

【问题讨论】:

标签: c++ coding-style


【解决方案1】:

这样的循环:

while (true)
{
    // do something
    if (something else) break;
    // do more
}

让您在中间跳出循环,而不是在开始 (while/for) 或结束 (do-while)。

如果您有一个复杂的条件,您可能还想使用这种样式来使代码更清晰。

【讨论】:

  • FWIW,我也更喜欢“while(true)”或“while(1)”而不是“for (;;)”。更容易阅读,IMO。
  • 一个需要复制的构造的好例子:A;而(别的东西){ B;一种; }
【解决方案2】:

我对嵌入式控制代码的主体使用无限循环,因为它被设计为一旦启动就永远运行。

【讨论】:

    【解决方案3】:
    while( 1 )
    {
        game->update();
        game->render();
    }
    

    编辑:也就是说,我的应用程序基本上是基于无限循环的,我不会费心去重构所有东西,只是为了拥有总是以从结尾掉下来而终止的美学纯度。主要()。

    【讨论】:

    • 我做了很多 cleanp 然后调用'exit()'。无论如何我都需要这个干净的关闭功能(例如assert()),为什么有两个不同的退出路径?
    【解决方案4】:

    有限状态机。它们不应该结束,直到你达到结束状态,此时你会中断或返回。

    【讨论】:

    • 这个我看不懂。为什么不直接写类似“while (!machine.state == finished) {machine.nextState();}
    • 不一定那么清楚,特别是如果您想在循环中的特定点测试 machine.state 变量。
    【解决方案5】:

    这是一个不完整的示例,因为它可以被重构为一个终端测试循环,而不会损失清晰度、功能或性能。

    int scoped_variable;
    do {
        scoped_variable = getSomeValue();
    } while (scoped_variable != some_value);
    

    当循环实例没有在最简单的情况下在顶部或底部有终止测试时,最常使用无限循环。当循环有两个部分时,往往会发生这种情况:每次都必须执行的代码,以及只能在每次迭代之间执行的代码。这往往发生在像 C 这样的语言中,在执行诸如从文件读取或处理数据库结果集之类的事情时,必须明确地完成很多事情。大多数具有较新范例的语言都可以将此类代码实际构建到测试中。

    【讨论】:

    • 您确定该变量仍在块外的范围内吗?
    • 为什么不呢: for (int scoped_variable; (scoped_variable = getSomeValue()) != some_value; ) ; (空循环体)。它可以作为 C99 和 C++ 程序在 Solaris 上使用 GCC/G++ 4.3.1。
    • 编辑了代码片段以修复范围问题。 for(...) 循环也是合法的,但对于 for(...) 的使用有点不寻常,因此许多程序员会回避它。
    【解决方案6】:

    我会考虑使用无限循环来对导弹的制导系统进行编程。

    while ( true ) { go2Target ( ) ; }
    

    从导弹制导计算机的角度来看,循环一旦开始就会重复直到时间结束。

    也许纯粹主义者会喜欢

    while ( ! blown2Bits ( ) ) { go2Target ( ) ; }
    

    但是你如何实现blow2Bits 方法呢?如果 blow2Bits 返回 true 意味着什么?

    【讨论】:

      【解决方案7】:

      几乎所有应用都使用无限 主循环。 ;)

      【讨论】:

        【解决方案8】:

        一个示例是在消息泵类型场景中,您希望永远循环处理传入的任何消息,直到被告知停止。另一种情况是,如果您想执行周期性操作,那么您可能会编写一个无限循环并在其中休眠(尽管为此使用某种形式的计时器可能会更好)。

        可能在其他一些地方循环必须执行一定量的工作来确定它是否应该退出,并且当这个条件为真时使用break而不是设置一些外部标志可能更干净指示循环应该退出。

        一般来说,虽然我认为如果可能的话,最好将退出条件放在循环语句中,而不是使其无限并使用break 语句退出循环,因为循环的退出条件更明显。

        【讨论】:

          【解决方案9】:

          还有其他问题与是否/何时可以在循环中使用break 有关。让我们假设我们同意有时是可以的。在这种情况下(希望很少见),如果有许多终止条件并且没有可识别的“主要”终止条件,我会使用无限循环。

          它避免了一长串的析取(or's),并且还提请读者注意循环中可能(几乎肯定会)有中断的事实。

          归根结底,这是一个品味问题。

          【讨论】:

            【解决方案10】:

            我使用它们编写循环直到收到终止/其他终止信号的 Linux 守护程序/服务。

            【讨论】:

              【解决方案11】:

              无限循环主要用于守护进程/服务进程或游戏中的主循环。你甚至可以和他们变得可爱,例如:

              const bool heatDeathOfTheUniverse = false;
              do 
              {
                   // stuff
              } while(!heatDeathOfTheUniverse);
              

              它们应该被用来“等待”诸如Fry 所建议的线程之类的东西。为此,您可以使用线程对象的 Join 方法。

              但是,如果您的技术主管说“无限循环是禁止的,多个方法/函数返回和中断也是如此”,您也可以执行以下操作:

              bool done = false;
              while(!done) 
              {
                  if(done = AreWeDone()) continue; // continue jumps back to start of the loop   
              } 
              

              当然,如果您的技术主管强迫您做这些事情,您应该开始寻找新工作。

              有关 continue 关键字的更多详细信息,请参阅 this MSDN 文章。

              【讨论】:

                【解决方案12】:

                网络服务器使用无限循环:

                while(true)
                {
                    //Do something like respond to requests
                }
                

                除非您关闭网络服务器应用程序,否则它们不必结束。

                【讨论】:

                  【解决方案13】:

                  我以前在c#中等待多个线程完成时使用它们,但现在我使用ThreadPool类。

                  【讨论】:

                    【解决方案14】:

                    除了嵌入式系统情况,无限循环总是真的是:

                    Repeat
                       Something
                    Until Exit_Condition;
                    

                    但有时 Exit_Condition 并不是可以在循环结束时实际评估的东西。您始终可以设置一个标志,使用该标志跳过循环的其余部分,然后在最后对其进行测试,但这意味着您至少要对其进行两次测试(代码稍慢),而且我个人觉得它不太清楚。

                    有时以清晰性换取速度是有道理的,但一些既不清晰也不速度的东西只是为了在技术上是正确的?对我来说听起来是个坏主意。任何称职的程序员都知道,while (true) 意味着终止条件位于循环内部。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-11-12
                      • 2010-10-23
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-08-08
                      • 2020-02-20
                      • 2012-11-06
                      相关资源
                      最近更新 更多