我有两个嵌套在一起的for循环:
for(...) {
for(...) {
}
}
我知道有一个`break`语句,但是我对于它是否会同时打破嵌套的循环还是只打破它所在的那个循环很困惑。当我发现没有必要再迭代更多次时,我需要同时打破两个循环。我有两个嵌套在一起的for循环:
for(...) {
for(...) {
}
}
我知道有一个`break`语句,但是我对于它是否会同时打破嵌套的循环还是只打破它所在的那个循环很困惑。当我发现没有必要再迭代更多次时,我需要同时打破两个循环。for (;;)
{
for (;;)
{
break; /* breaks inner loop */
}
for (;;)
{
goto outer; /* breaks outer loop */
}
}
outer:;
break可以跳出当前循环,但你可以在外层循环中添加一个检查,当内层循环跳出时也会跳出外层循环。
bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
for ( ... ) {
if (...) {
dobreak = true;
break;
}
}
}
!dobreak
放错了位置,应该在条件语句中而不是增量步骤中;我还会使用 !dobreak && ..
,这样在跳出循环时就不需要评估其他条件了。我同意 sigjuice 的观点:适当使用 goto
并不是不好的编程习惯,在这种情况下,goto
确实 可以使代码更好。 - ephemientcontinue
语句替换 break
来解决。不过,这只是更多需要担心的不明显的东西。 - Ori Pessachbreak
语句只能使你退出最内层的循环。如果你不想在代码、内存和性能上增加额外的负担,我建议将代码重构为自己的函数或方法,并使用return
来跳出所有循环:
void do_lots_of_work(void)
{
int i, j;
for(i=0; i<10 ; i++)
{
for(j=0;j< 10; j++)
{
..
..
if(disaster_struck())
return; /* Gets us out of the loops, and the function too. */
}
}
}
除了已经提到的标志变量或goto之外,您可以抛出Objective-C异常:
@try {
for() {
for() {
@throw ...
}
}
}
@catch{
...
}
其他人已经提到了如何设置标志或使用goto
,但我建议您重构代码,将内部循环转换为单独的方法。该方法可以返回一些标志,以指示外部循环应该break
。如果您适当地命名方法,这样更易读。
for (int i = 0; i < 10; i++) {
if (timeToStop(i)) break;
}
-(bool) timeToStop: (int) i {
for (int j = 0; j < 10; j++) {
if (somethingBadHappens) return true;
}
return false;
}
伪代码,未经过测试,但你能明白意思。
break语句只能跳出当前循环的范围,也就是父级循环。如果你想要同时跳出第二个循环,你可以使用一个布尔变量,该变量在两个循环的范围内。
bool isTerminated = false;
for (...)
{
if (!isTerminated)
{
for(...)
{
...
isTerminated = true;
break;
}
}
else
{
break;
}
}
另一个解决方案是将第二个循环提取到一个函数中:
int i;
for(i=0; i<10 ; i++){
if !innerLoop(i) {
break;
}
}
bool innerLoop(int i)
int j;
for(j=0;j< 10; j++){
doSomthing(i,j);
if(endcondtion){
return false;
}
}
}
for(i=0; i<10 && (done==false); i++)
for(j=0;j< 10; j++){
..
..
if(...){done=true; break;}
}
在退出循环之前更改顶部循环计数器
for(i=0; i<10 ; i++)
for(j=0;j< 10; j++){
..
..
i = 10;
break;
}
NSUInteger limit = 10;
然后:
for(i=0; i<limit; i++) { for(j=0; j<10; j++) { .. .. i = limit; break; } }
- Matt Mcbreak语句会跳出最内层的循环。如果要跳出外层循环,需要添加额外的测试和break语句。
for (;;) {for (;;) {break; /* breaks inner loop */} for (;;) {goto outer; /* breaks outer loop */}} outer:;
不断重复一个空语句的无限循环嵌套结构。内层循环包含一个break;
语句用于跳出内层循环,外层循环包含一个带标签的goto
语句用于跳出外层循环。最终程序进入到带有标签outer
的行并跳出了外层循环。 - ephemient