为什么要使用无限循环
Why use infinite loops?
另一位发帖者询问了无限循环的首选语法。
接下来的问题是:为什么在代码中使用无限循环?我通常会看到这样的结构:
for (;;) {
int scoped_variable = getSomeValue();
if (scoped_variable == some_value) {
break;
}
}
这使您可以避免在for
或while
子句中看不到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)意味着终止条件在循环中。
- 为什么这段代码会导致无限循环?
- 为什么这种方法会进入无限循环?
- 试图找出为什么我的代码保持无限循环
- 为什么这个递归函数会创建一个无限循环?
- 为什么无限循环会延迟打印?
- 如何找出为什么我的程序一直有一个无限循环?
- 为什么我的代码在 c++ 中无限循环.我的代码需要反复提示用户
- 异常基础知识:为什么 while 循环会变成无限循环?
- 为什么这会导致无限循环?
- 为什么我有一个无限循环,我如何以不同的方式做到这一点
- 打电话给功能后,为什么我会陷入无限循环中
- 为什么输出会进入无限循环
- 为什么我会得到一个无限循环(因子)?
- 为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试
- 为什么输入流无法识别 Ctrl D 并给出无限循环
- 为什么这段代码陷入无限循环?
- 为什么我总是得到一个无限循环
- 为什么要(;;);无限循环
- 为什么当用户输入除整数之外的任何内容时,我的程序会无限循环输出?C++
- 无限循环,我不知道为什么