为什么要使用无限循环

Why use infinite loops?

本文关键字:无限循环 为什么      更新时间:2023-10-16

另一位发帖者询问了无限循环的首选语法。

接下来的问题是:为什么在代码中使用无限循环?我通常会看到这样的结构:

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

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

类似于的循环

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

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

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

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

while( 1 )
{
    game->update();
    game->render();
}

编辑:也就是说,我的应用程序从根本上讲是基于一个无限循环的,我不会为了拥有总是从main()的末尾掉下来而终止的美学纯粹性而对所有内容进行重构。

有限状态机。它们不应该结束,直到你达到一种结束状态,在这一点上你会崩溃或返回。

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

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

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

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

while ( true ) { go2Target ( ) ; }

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

也许纯粹主义者会支持

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

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

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

一个例子是在消息泵类型的场景中,您希望永远循环处理传入的任何消息,直到被告知停止。另一种是,如果你想采取周期性的动作,那么你可以写一个无限循环,其中包含睡眠(尽管最好使用某种形式的计时器)。

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

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

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

它避免了一长串的析取(或),也让读者注意到循环中可能会(几乎肯定会)出现中断。

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

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

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

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关键字的更多详细信息,请参阅MSDN的这篇文章。

Web服务器使用无限while循环:

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

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

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

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

Repeat
   Something
Until Exit_Condition;

但有时Exit_Condition并不是可以在循环结束时实际计算的东西。你可以总是设置一个标志,用这个标志跳过循环的其余部分,然后在最后测试它,但这意味着你至少要测试两次(代码稍微慢一点),我个人觉得它不太清楚。

有时,用清晰度换取速度是有意义的,但既不清晰也不快速的东西只是为了技术上的正确?对我来说,这听起来是个坏主意。任何有能力的程序员都知道while(true)意味着终止条件在循环中。