如何使用break语句停止内部和外部循环

Szu*_*Szu 4 c++ loops for-loop objective-c break

break在内部循环中使用的代码非常简单:

for (int it=0; it<5; it++) {
    for (int it2=0; it2<5; it2++) {
        if (it2==2) 
            break; //break here not it2, but it loop
        NSLog(@"it=%d it2=%d", it, it2);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个输出:

it=0 it2=0, it=0 it2=1, 
it=1 it2=0, it=1 it2=1, 
it=2 it2=0, it=2 it2=1,
it=3 it2=0, it=3 it2=1,
it=4 it2=0, it=4 it2=1
Run Code Online (Sandbox Code Playgroud)

我知道在某些程序语言中有可能确定哪个循环中断语句应该影响.是否可以调用break停止外循环(forit变量)?

Adr*_*ala 12

如果你真的想这样做,那就咬紧牙关并使用goto.

for (int it=0; it<5; it++) {
    for (int it2=0; it2<5; it2++) {
        if (it2==2) 
            goto end_outer_loop;
        NSLog(@"it=%d it2=%d", it, it2);
    }
}

end_outer_loop:

// more stuff here.
Run Code Online (Sandbox Code Playgroud)

这是合法的goto(大多数在向下的方向都是).实际上break是一种特殊的"已批准"goto,因为C是一种最小的语言,所以在复杂的情况下你必须使用一个明确的goto.

然而,正如这里的许多人所指出的那样,如果你可以使用它会更好return. 你不应该扭曲你的程序只是为了避免goto,但在大多数情况下,这是一个线索,你的功能变得太复杂,因此应该分解.

  • 把事情分解成更小的功能是件好事.但你不应该这样做*只是为了你可以避免转到*.这实际上取决于循环是否与计算密切相关.这就是为什么其他语言具有特殊语言功能的原因(循环标签,断点的整数参数等). (9认同)
  • 当人们问我'goto`的合法用途时,这是我能引用的唯一一个例子,它实际上是在实际使用中.我不知道为什么人们对`goto`如此厌恶,但对于`switch`完全没问题,因为它的范围,它会带来同样的后果. (2认同)
  • @tenfour正是这个.这就像每个人都停止思考只是因为他们被告知"goto is teh evul!" 有一天. (2认同)
  • 我同意这是少数应该使用的案例之一.使用函数感觉就像为了不使用goto而强制使用不同的设计. (2认同)

Cin*_*out 5

您可以使用a bool flag来达到目的,如下所示:

bool flag = false;
for (int it=0; it<5; it++) {
    for (int it2=0; it2<5; it2++) {
        if (it2==2) { flag=true; break; }
        NSLog(@"it=%d it2=%d", it, it2);
    }
    if(flag) {break;}
}
Run Code Online (Sandbox Code Playgroud)

仅当您不能使用return其他人指定的方法时,才应使用此方法.return提高代码可读性.这只是一种解决方法.

goto方法也是有效的,但总是建议不要使用goto,因为它会破坏控制流,如果代码足够大,可能会导致数小时的调试!

  • 在我看来,这比使用 `goto` 可读性和清晰度都差。 (3认同)