Objective-C中的for循环break和continue

41

我如何在带有标签的for循环中使用'break'语句?

例如:

outer: for(int i = 0;i<[arABFBmatches count];i++){
    for(int i = 0;i<[arABFBmatches count];i++){
        //
        break _____;
    }
}

如何跳出外层循环?

5个回答

110

从你的问题中很难说。我的理解是你想跳过内部循环的其余迭代,并继续外部循环吗?

for (int i = 0; i < [arABFBmatches count]; i++) {
    for (int j = 0; j < [arABFBmatches count]; j++) {
        if (should_skip_rest)
            break; // let outer loop continue iterating
    }
}
请注意,我更改了您内部循环不变量的名称; 在两个中都使用i会招致疯狂。
如果您想从两个循环中都退出,我不会使用goto。我会这样做:
BOOL allDoneNow = NO;
for (int i = 0; i < [arABFBmatches count]; i++) {
    for (int j = 0; j < [arABFBmatches count]; j++) {
        if (should_skip_rest) {
            allDoneNow = YES;
            break;
        }
    }
    if (allDoneNow) break;
}

10
为了提高可读性,让我们不要忘记在运算符周围加上空格。不要写成 "for(int i = 0;i<[arABFBmatches count];i++)",而应该写成 "for (int i = 0; i < [arABFBmatches count]; i++)"。 - Erik van der Neut

12
大致意思是:
for(int i = 0;i<[arABFBmatches count];i++){
    for(int j = 0;j<[arABFBmatches count];j++){
        //
        goto outer_done;
    }
}
outer_done:

Objective-C 没有标记的 break 语句。


1
如果你要使用 goto,请非常非常小心,确保你正确处理内存管理。 - Dave DeLong
goto 比设置标志并测试标志以确定是否退出外部循环更好。当然,我们必须小心。 - neevek
4
并不一定更好;如果内部循环被一些设置/拆卸逻辑包围,goto可能会轻松地跳过拆卸操作。如果以后必须添加此类逻辑,重构时很容易忘记短路情况。有一个强有力的论点支持无跳转的控制流程。 - bbum
我认为应该避免使用“goto”。除了bbum提出的优秀理由外,它还会损害代码的可读性。 - Erik van der Neut

3
BOOL done = NO;
for(int i = 0;i<[arABFBmatches count] && !done; i++)
{
    for(int i = 0;i<[arABFBmatches count] && !done;i++)
    {
        if (termination condition) 
        {
             // cleanup
             done = YES;
        }
    }
}

1
你能否也添加一些解释? - Robert

3

来自苹果公司Objective-C文档:

Objective-C被定义为标准ANSI C语言的一组小而强大的扩展。

因此,break和continue可以在C语言允许的任何地方使用。

continue可以在循环结构(for、while和do/while循环)中使用。

break可以在这些相同的循环结构以及switch语句中使用。


1

'break'只能跳出最里层的循环或者switch语句。你可以使用'return'在任何时候退出函数。请查看this链接。


大多数商业设计规则要求函数只返回一个(1)值。 - Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接