如何在不使用“goto”的情况下摆脱这个深度嵌套的循环?

时间:2013-05-15 20:43:43

标签: c loops break goto

在类似下面的循环的情况下,除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!") ;
}

4 个答案:

答案 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,则奖励积分。

如果您遵循一些简单的规则,那就不是那么糟糕:仅向前分支,不分支到控制结构(ifwhilefor等。),不要对声明或初始化等进行分支。基本上将其视为break语句。但说实话,如果你可以避免使用它,那就这样做吧。