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

C++ 如何使用break语句停止内部和外部循环,c++,objective-c,loops,for-loop,break,C++,Objective C,Loops,For Loop,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); } } 我知道,在一些编程语言中,有可能确定哪一个循环中断语句应该受

我有非常简单的代码,在内部循环中使用
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);
    }
}

我知道,在一些编程语言中,有可能确定哪一个循环中断语句应该受到影响。是否可以调用
break
停止外部循环(
for
使用
it
变量)

如果你真的想这么做,那么咬紧牙关,使用
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.

for(int it=0;it您应该将循环包装在一个函数中,然后使用
return
从该函数返回。

在使用goto语句编程时,会使程序的逻辑变得复杂和纠结。在现代编程中,goto语句被认为是有害的构造和糟糕的编程实践

您可以将其用作函数,并在条件发生时退出函数

int loop(int it,int it2)
{
  for (int it=0; it<5; it++) {
    for (int it2=0; it2<5; it2++) {
        if (it2==2) return 0; //function returns here
        NSLog(@"it=%d it2=%d", it, it2);
    }
  }
  return 1;
}
int循环(int-it,int-it2)
{

对于(int it=0;it,您可以使用
bool标志
来达到此目的,如下所示:

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;}
}
bool标志=false;

对于(int=0;它不幸的是,C++没有这种中断。一种被认为是憎恶的可能性是使用GOTO。 有两种可接受的解决方案:

  • 将此代码放在单独的函数中,并使用return

  • 使用布尔标志

    bool stopFlag=false;
    对于C/C++中的(int it=0;it),你真的没有这样的东西。显然已经有了一些答案,比如使用
    goto
    或其他什么。就个人而言,我不喜欢
    goto
    以及它们会导致一些草率的代码(IMO)

    对我来说,你有两个很好的选择

  • 编写循环条件,使其在两者中都包含退出条件。这是我个人的做法,因为我不喜欢在循环中使用
    break
    或其他东西,除非我绝对必须这样做。我只是认为这有助于清洁产品,这就是我所学到的

  • 如果您确实决定保留中断,那么不要用一行
    If()
    来控制它,而是将它分成两部分,并创建一个“中断标志”,如果满足中断条件,将设置该标志。从这里开始,在外部循环中放置一个附加条件,如果设置了该标志,则退出,或者使用另一个
    If()
    在外循环内(但不在内循环内),如果设置该标志,将断开



  • 希望这能有所帮助。

    goto
    不应该在这里使用。这是一个函数的教科书用例。最好将东西分解成更小的函数。但你不应该这样做只是为了避免goto。这实际上取决于循环是否与计算密切相关。这就是为什么其他语言有特殊的lan这方面的语言特性(循环标签、中断的整数参数等).当人们问我如何合法使用
    goto
    时,这是我唯一可以引用的实际常用的例子。我不知道为什么人们对
    goto
    如此反感,但对
    switch
    完全没问题,因为它的作用域,具有相同的后果。@tenfour正是这个。这和每个人都一样有一天,他们停止了思考,因为他们认为这是少数几个应该使用的案例之一。使用函数就像是为了不使用Goto而强制不同的设计。C或C++,No.Burn只用于当前的循环C。(除了
    goto
    label),但是您可以从第一个循环中断,并设置一个标志来中断第二个循环。对于您的问题,您有两个选项:
    goto
    或一个函数。更有趣的问题是:您的实际问题是什么(您提供的示例看起来很做作),你想用哪种语言来解决它?我在objective-c中遇到了这样的问题,但每次它出现时,我都会找到避免两个for循环的好方法。这是一个典型的由于语言方面的原因而强制设计的案例。这应该是另一种方式。我同意,在某些情况下,这可能是解决问题的方式。很难给出一个明确的答案在不知道OPs实际问题的情况下回答。我认为,对于几乎所有的用例,将迭代封装到一个实现算法的函数中比使用
    goto
    得到更干净的解决方案。一个好的启发是询问您是否能为该函数取一个好名字。这与询问该循环是否执行som是一样的e不同的、可识别的东西。如果存在这样的名称,那么它会使代码自我评论。如果不存在这样的名称,那么内嵌文本将更容易阅读,因为它避免了读者必须穿透额外的间接层。在这种情况下,
    goto
    被认为是完美的。并且不会增加太多的复杂性,因为标签真的很接近跳跃。我同意goto是有用的,但从专业程序员的角度来看,使用goto语句被认为是一个坏习惯。因为这可能会在复杂程序中阅读代码时产生歧义。在简单的程序中是可以的。但是对于他的kNoeLeGe我让他知道使用Goto是一个坏习惯。除了这个例子,它被认为是一个坏习惯。地狱,甚至MISRA C++允许这样。我不知道如何在函数中包装循环更好,它只是减少了我的阅读可读性,并且没有任何好处,因为返回也打破了控制流。作为一名专业程序员,您是否使用异常或
    switch
    语句?所有这些都会在复杂程序中被误用时给其他人阅读代码造成歧义。这总是取决于功能的使用方式,在这个特定的用例中
    goto
    肯定不会被视为坏习惯。在我看来,这是一种可读性较差的习惯nd比使用
    goto
    更清晰。我也有同样的想法,但如果语句不必要。您可以添加条件
    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;}
    }