用于永无止境的循环

Uses for never-ending loops

永无止境的循环有哪些用途?它们通常是编程中的坏消息,但您是否曾希望循环永无止境?

无限循环只有在无意或使用会产生意想不到的后果时才是坏消息。如果您有意使用它们,则与您可能考虑的任何其他循环分类没有区别。然而,尽管有意使用,你仍然会最终破坏东西。当你想在循环终止后访问迭代器或索引组件时,通常使用这种形式,例如:

index = 0;
result = null;
for (;;)
    result = foo(index);
    if (bar(result))
        break;
    index += result;
use(index, result);

请注意,根据上下文,在循环范围之外更改数据可能非常不受欢迎,因此这是否是一个好的用例实际上取决于上下文。对于另一个类似的例子,实际的迭代器可能是循环外所需的对象,但在循环头中初始化它将不允许在循环外访问。无限循环可以解决这个问题。

for (foo.iterator(); foo.hasNext(); ) {
    use(foo.next());
}
keep_using(foo.next());  // throws an error

此外,无限循环在某些情况下可以提高可读性,尤其是在有很多中断条件但它们可能并非都来自互斥单元的情况下。例如,假设我们有以下内容:

for (;;) {
    if (condition1)
        break;
    else if (condition2)
        do_stuff();
    else if (condition3)
        break;
    else
        do_something();
}

这可以使用循环的三个组件重写为:

for (condition = true; condition; iteration) {
    if (condition1 || condition3)
        condition = false;
    else if (condition2)
        do_stuff();
    else
        do_something();
}

然而,如果我们对原始代码进行少量更改(至少在屏幕上的字符方面):

for (;;) {
    if (condition1);
        break;

    if (condition2);
        do_stuff();

    if (condition3);
        break;
    else
        do_something();
}

重写变成了需要我们绕过这个额外变量的东西:

for (condition = true; condition; iteration) {
    if (condition1)
        condition = false;

    if (condition2) {
        do_stuff();
        condition = true;
    }

    if (condition3)
        condition = false;
    else {
        do_something();
        condition = true;
    }
}

随着循环体的增加,这很快就会变得难以阅读和维护,尤其是复杂性会增加,例如,如果 condition 实际上是许多不同的条件,例如 a || b || c < d || (e > f) && (a > f);或者,该循环包含多个嵌套循环。尽管您可能会将相同的逻辑应用于其他原始更改版本。

另一个与可读性相关的示例涉及冗长的初始化,但不可否认这不是一个很好的用例:

for (more_long = some_ridiculously_long.initialization_statement.longer_than.Long_Long_Mans_Sakeru_gummy();
    more_long < lots_of && more_long < break_conditions
    maybe_even_an_update_that_hangs_at_ninety_nine_percent) {
    ...
}