永无止境的循环有哪些用途?在编程中,它们通常是个坏消息,但是有没有一次您希望循环永无止境的机会?
答案 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) {
...
}