Loops 为什么大多数/所有语言都没有多循环中断函数?
我还没有见过任何编程语言有一个简单的函数来打破嵌套循环。我想知道:Loops 为什么大多数/所有语言都没有多循环中断函数?,loops,break,Loops,Break,我还没有见过任何编程语言有一个简单的函数来打破嵌套循环。我想知道: 是不是有什么低层次的东西让这变得不可能 下面是我的意思的一个例子(C#): 只是break类似于中断1,并仅使您脱离最内部的循环 有些语言有凌乱的替代方案,如goto,它们可以工作,但没有上面提出的解决方案那么优雅。虽然这是更多的推测,但有一些支持和反对这种可能性的论点 赞成者: 在某些情况下可能非常优雅 反对: 可能导致临时写入深度嵌套的循环,有些人认为这是不可取的 可以使用goto实现所需的行为 可以使用辅助变量实现所需的行
是不是有什么低层次的东西让这变得不可能 下面是我的意思的一个例子(C#): 只是
break代码>类似于中断1代码>,并仅使您脱离最内部的循环
有些语言有凌乱的替代方案,如goto
,它们可以工作,但没有上面提出的解决方案那么优雅。虽然这是更多的推测,但有一些支持和反对这种可能性的论点
赞成者:
在某些情况下可能非常优雅
反对:
可能导致临时写入深度嵌套的循环,有些人认为这是不可取的
可以使用goto
实现所需的行为
可以使用辅助变量实现所需的行为
在大多数情况下,嵌套循环可以重构为只使用一个循环
可以使用异常处理实现所需的行为(但另一方面,控制预期的执行流不是异常处理的主要任务)
所说的,我认为“代码> Goto 的合法用法是合法的。
尽管这是一个更大的推测,但也有一些反对和反对的理由。
赞成者:
在某些情况下可能非常优雅
反对:
可能导致临时写入深度嵌套的循环,有些人认为这是不可取的
可以使用goto
实现所需的行为
可以使用辅助变量实现所需的行为
在大多数情况下,嵌套循环可以重构为只使用一个循环
可以使用异常处理实现所需的行为(但另一方面,控制预期的执行流不是异常处理的主要任务)
以上所说的,我认为“<代码> Goto < /Cord>”的合法用法是合法的。
< P>不,在低级别上没有什么可以阻止创建像你所提议的那样的东西。还有很多语言是用高级语言实现的,这肯定会允许这种行为
然而,在设计一种反对这种结构的语言时,有几个考虑因素,至少在我看来是这样的
主要论点是,它为一个非常复杂的结构打开了大门,而这个结构可能过于复杂。嵌套循环本质上很难跟踪和了解发生了什么。
如果你加上你的构造,可能会使它们更加复杂
除非您将<代码>返回< /COD>语句作为一种<代码>破解< /代码>当然:
< P>不,在低级别上没有什么会阻止创建像您所提议的那样的东西。还有很多语言是用高级语言实现的,这肯定会允许这种行为
然而,在设计一种反对这种结构的语言时,有几个考虑因素,至少在我看来是这样的
主要论点是,它为一个非常复杂的结构打开了大门,而这个结构可能过于复杂。嵌套循环本质上很难跟踪和了解发生了什么。
如果你加上你的构造,可能会使它们更加复杂
除非您将<代码>返回< /COD>语句作为一种<代码>中断<代码>当然:
Perl确实具有与此特性非常相似的特性。而不是嵌套的数量
该功能旨在消除在深度嵌套循环中使用循环控件时的歧义。使用标签可以提高可读性,并在嵌套级别发生变化时提供保护。它减少了内部循环关于外部循环的知识量,尽管它们仍然有知识
嵌套也是非词法的,它将跨越子例程边界。这就是它变得怪异和更像后继的地方
FOREVER:while (1) {
for my $string (@strings) {
do_something;
}
}
sub do_something {
last FOREVER;
}
出于各种原因,这并不是一个好特性。这种特性会产生非常复杂的逻辑。将深度嵌套的循环重新构造为多个子例程调用几乎总是更好的
sub forever {
while (1) {
for my $string (@strings) {
return;
}
}
}
你所要求的,本质上是一个受限的转到。它包含了大多数赞成和反对的相同论点
while (1) {
for my $string (@strings) {
goto FOREVER;
}
}
FOREVER:print "I have escaped!\n"
从结构的角度来看,说“突破第n个嵌套循环”比“跳转”更糟糕。这意味着内部代码对其周围环境有着密切的了解。如果嵌套发生更改,所有内部循环控件都可能会中断。它为重构制造了障碍。例如,如果要在内部循环上执行
while (1) {
twiddle_strings(@strings);
}
sub twiddle_strings {
for my $string (@strings) {
last 2;
}
}
现在,控制外部循环的代码与内部循环的功能完全不同。如果外环发生变化怎么办
while (1) {
while(wait_for_lock) {
twiddle_strings(@strings);
}
}
sub twiddle_strings {
for my $string (@strings) {
last 2;
}
}
Perl确实具有与此功能非常相似的功能。而不是嵌套的数量
该功能旨在消除在深度嵌套循环中使用循环控件时的歧义。使用标签可以提高可读性,并在嵌套级别发生变化时提供保护。它减少了内部循环关于外部循环的知识量,尽管它们仍然有知识
嵌套也是非词法的,它将跨越子例程边界。这就是它变得怪异和更像后继的地方
FOREVER:while (1) {
for my $string (@strings) {
do_something;
}
}
sub do_something {
last FOREVER;
}
出于各种原因,这并不是一个好特性。这种特性会产生非常复杂的逻辑。将深度嵌套的循环重新构造为多个子例程调用几乎总是更好的
sub forever {
while (1) {
for my $string (@strings) {
return;
}
}
}
你所要求的,本质上是一个受限的转到。它带着我