用于永无止境的循环

时间:2019-06-30 08:53:46

标签: loops infinite-loop

永无止境的循环有哪些用途?在编程中,它们通常是个坏消息,但是有没有一次您希望循环永无止境的机会?

1 个答案:

答案 0 :(得分:1)

无限循环仅在不希望使用或有意料之外的后果时才是坏消息。如果您有意使用它们,则可以考虑与其他任何循环分类没有区别。但是,尽管有意使用,您仍然会破坏事物。当您要在循环终止后访问迭代器或索引组件时,通常使用这种形式,例如:

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) {
    ...
}