用于永无止境的循环
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) {
...
}
永无止境的循环有哪些用途?它们通常是编程中的坏消息,但您是否曾希望循环永无止境?
无限循环只有在无意或使用会产生意想不到的后果时才是坏消息。如果您有意使用它们,则与您可能考虑的任何其他循环分类没有区别。然而,尽管有意使用,你仍然会最终破坏东西。当你想在循环终止后访问迭代器或索引组件时,通常使用这种形式,例如:
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) {
...
}