关于c ++:我可以使用break来退出多个嵌套for循环吗?

Can I use break to exit multiple nested for loops?

是否可以使用break函数退出多个嵌套的for循环? 如果是这样,你会怎么做呢? 你还可以控制休息退出的循环次数吗?


不,不要用break破坏它。这是使用goto的最后一个据点。


AFAIK,C ++不支持命名循环,如Java和其他语言。您可以使用goto,或创建您使用的标志值。在每个循环结束时检查标志值。如果设置为true,那么您可以突破该迭代。


打破嵌套循环的另一种方法是将两个循环分解为单独的函数,并在要退出时将该函数的return分解。

当然,这提出了另一个论点,即你是否应该从最后的任何地方的函数中明确地return


只是使用lambdas添加一个明确的答案:

1
2
3
4
5
6
7
8
9
  for (int i = 0; i < n1; ++i) {
    [&] {
      for (int j = 0; j < n2; ++j) {
        for (int k = 0; k < n3; ++k) {
          return; // yay we're breaking out of 2 loops here
        }
      }
    }();
  }

当然这种模式有一定的局限性,显然只有C ++ 11,但我认为它非常有用。


break将仅退出包含它的最内层循环。

你可以使用goto来打破任何数量的循环。

当然goto通常被认为是有害的。

is it proper to use the break function[...]?

使用break和goto会使得更难以推断程序的正确性。看到这里讨论:Dijkstra并不疯狂。


虽然这件衣服已经出现了,但我认为一个好方法是做到以下几点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(unsigned int z = 0; z < z_max; z++)
{
    bool gotoMainLoop = false;
    for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
    {
        for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
        {
                          //do your stuff
                          if(condition)
                            gotoMainLoop = true;
        }
    }

}


这个怎么样?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(unsigned int i=0; i < 50; i++)
{
    for(unsigned int j=0; j < 50; j++)
    {
        for(unsigned int k=0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                j=50;
                k=50;
            }
        }
    }
}


使用goto和标签打破嵌套循环的代码示例:

1
2
3
4
for (;;)
  for (;;)
    goto theEnd;
theEnd:

打破几个嵌套循环的一个好方法是将代码重构为函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo()
{
    for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < 50; j++)
        {
            for(unsigned int k=0; k < 50; k++)
            {
                // If condition is true
                return;
            }
        }
    }
}


goto对于破坏嵌套循环非常有帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (i = 0; i < 1000; i++) {
    for (j = 0; j < 1000; j++) {
        for (k = 0; k < 1000; k++) {
             for (l = 0; l < 1000; l++){
                ....
                if (condition)
                    goto break_me_here;
                ....
            }
        }
    }
}

break_me_here:
// Statements to be executed after code breaks at if condition

The break statement terminates the execution of the nearest enclosing do, for, switch, or while statement in which it appears. Control passes to the statement that follows the terminated statement.

来自msdn。


我确实认为goto在这种情况下有效:

要模拟break / continue,您需要:

打破

1
2
3
4
5
6
7
8
9
for ( ;  ;  ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            goto theEnd;
        }
    }
}
theEnd:

继续

1
2
3
4
5
6
7
8
9
10
for ( ;  ; ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            i++;
            goto multiCont;
        }
    }
    multiCont:
}


只需一个bool变量就可以打破任意数量的循环,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bool check = true;

for (unsigned int i = 0; i < 50; i++)
{
    for (unsigned int j = 0; j < 50; j++)
    {
        for (unsigned int k = 0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                check = false;
                break;
            }
        }
        if (!check)
        {
            break;
        }
    }
    if (!check)
    {
        break;
    }
}

在这段代码中,我们break;所有的循环。


我知道这是老帖子。但我建议有点逻辑和简单的答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < conditionj; j++)
        {
            for(unsigned int k=0; k< conditionk ; k++)
            {
                // If condition is true

                j= conditionj;
               break;
            }
        }
    }


其他语言(如PHP)接受一个break参数(即break 2;)来指定你想要突破的嵌套循环级别的数量,但C ++却没有。您必须使用在循环之前设置为false的布尔值,如果要中断,在循环中设置为true,加上嵌套循环后的条件中断,检查布尔值是否设置为true并且如果是,则打破。


1
2
3
4
5
6
7
8
9
10
11
12
  while (i<n) {
    bool shouldBreakOuter = false;
    for (int j=i + 1; j<n; ++j) {
      if (someCondition) {
          shouldBreakOuter = true;
      }
    }

    if (shouldBreakOuter == true)
      break;

  }


你可以使用try ... catch。

1
2
3
4
5
6
7
8
9
10
try {
    for(int i=0; i<10; ++i) {
        for(int j=0; j<10; ++j) {
            if(i*j == 42)
                throw 0; // this is something like"break 2"
        }
    }
}
catch(int e) {} // just do nothing
// just continue with other code

如果你必须同时打破几个循环,那么它通常是一个例外。


断开for循环对我来说有点奇怪,因为for循环的语义通常表明它将执行指定的次数。但是,在所有情况下都不错;如果你正在寻找一个集合中的东西,并想在你找到它之后破解它,那么它很有用。但是,在C ++中不可能打破嵌套循环;通过使用标记的中断,它是其他语言。你可以使用标签和goto,但这可能会让你在晚上胃灼热..?似乎是最好的选择。