在类似下面的循环的情况下,除goto
之外的其他方法是什么方法可以立即退出嵌套循环?
#include<stdio.h>
int main(void)
{
int i,j,k ;
for(i=1;i<=3;i++)
{
for(j=1;j<=3;j++)
{
for(k=1;k<=3;k++)
{
if(i==3&&j==3&&k==3)
goto out ;
else
printf("%d%d%d\n",i,j,k) ;
}
}
}
out :
printf("Out of the loop at last!") ;
}
答案 0 :(得分:5)
goto
合理使用时也不错。
如果您需要一次退出多个循环,通常意味着您的代码应该重新设计。这种“级联休息就像紧急出口一样。也许是时候将代码移到单独的函数中并在那里使用return
。
答案 1 :(得分:2)
一种解决方案可能是附加条件。
#include<stdio.h>
int main(void)
{
int i,j,k ;
int abort = 0;
for(i=1; i<=3 && !abort; i++)
{
for(j=1; j<=3 && !abort; j++)
{
for(k=1; k<=3 && !abort; k++)
{
if(i==3&&j==3&&k==3)
abort = 0;
else
printf("%d%d%d\n",i,j,k) ;
}
}
}
printf("Out of the loop at last!") ;
}
答案 2 :(得分:1)
忘记那些“来源” - goto
有正当理由。此外,break
并没有完全不同。
但是,如果您真的想要,可以将循环移动到它们自己的子功能中,并将其保留为return
。
答案 3 :(得分:1)
这是少数使用goto
可以接受的情况之一,尽管重新考虑这个循环会更好。
goto
的主要问题是它可以通过简单的检查破坏调试代码的能力。
请考虑以下代码段:
i = 10;
label: printf("%d\n", i);
为i
打印的值是多少?行i = 10;
甚至被执行了吗?直到我在函数中考虑goto label;
的每个实例,我都无法知道,这意味着我必须手动跟踪执行路径。根据功能的大小,这可能会从轻微的烦恼变成屁股的主要痛苦。如果在同一功能中有额外的goto
s,则奖励积分。
如果您遵循一些简单的规则,那就不是那么糟糕:仅向前分支,不分支到控制结构(if
,while
,for
等。),不要对声明或初始化等进行分支。基本上将其视为break
语句。但说实话,如果你可以避免使用它,那就这样做吧。