0

在像下面的循环这样的情况下,除了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

4 回答 4

5

goto合理使用也不错。

如果您需要一次退出多个循环,这通常意味着您的代码应该重新设计。这种“级联中断”类似于紧急出口。也许是时候将您的代码移动到一个单独的函数中并return在那里使用了。

于 2013-05-15T20:48:11.803 回答
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!") ;
}
于 2013-05-15T20:50:50.057 回答
1

忘记那些“来源” - 有正当理由goto。此外,break并没有太大的不同。但是,如果您真的想要,您可以将循环移动到它们自己的子函数中,并将其保留为return.

于 2013-05-15T20:49:50.517 回答
1

这是可以接受使用 a 的少数情况之一goto,尽管重新考虑该循环会更好。

主要问题goto是它可以通过简单的检查破坏调试代码的能力。

考虑以下代码片段:

i = 10;
label: printf("%d\n", i);

打印什么值i?这条线i = 10;甚至被执行了吗?直到我考虑到函数中的每个实例后我才能知道goto label;,这意味着我必须手动跟踪执行路径。根据函数的大小,这可能会从轻微的烦恼变成严重的痛苦。goto如果同一函数中 有额外的 s,则加分。

如果您遵循一些简单的规则,那还不错:仅向前分支,不要分支到控制结构(if, while,for等),不要分支声明或初始化等。基本上像对待它一样声明break。但老实说,如果你可以避免使用它,那就这样做吧。

于 2013-05-15T21:31:00.293 回答