Могу ли я использовать break для выхода из нескольких вложенных циклов? - PullRequest
273 голосов
/ 11 августа 2009

Можно ли использовать функцию break для выхода из нескольких вложенных циклов for? Если так, как бы вы поступили? Можете ли вы также контролировать, сколько петель выходит из перерыва?

Ответы [ 17 ]

250 голосов
/ 11 августа 2009

Нет, не портите его с break. Это последний оставшийся оплот для использования goto.

215 голосов
/ 11 августа 2009

AFAIK, C ++ не поддерживает циклы именования, как Java и другие языки. Вы можете использовать goto или создать значение флага, которое вы используете. В конце каждого цикла проверьте значение флага. Если для него установлено значение true, вы можете выйти из этой итерации.

52 голосов
/ 11 августа 2009

Другой подход к выходу из вложенного цикла состоит в выделении обоих циклов в отдельную функцию и return из этой функции, когда вы хотите выйти.

Конечно, это приводит к другому аргументу о том, следует ли вам когда-либо явно return из функции где-либо, кроме как в конце.

47 голосов
/ 16 октября 2015

Просто чтобы добавить явный ответ, используя лямбды:

  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, но я думаю, что он весьма полезен.

32 голосов
/ 11 августа 2009

break будет выходить только из самого внутреннего цикла, содержащего его.

Вы можете использовать goto , чтобы разбить любое количество циклов.

Конечно, Перейти часто Считается вредным .

уместно ли использовать функцию прерывания [...]?

Использование break и goto может усложнить рассуждение о правильности программы. Смотрите здесь для обсуждения этого: Дейкстра не была безумной .

19 голосов
/ 03 ноября 2011

Хотя этот ответ уже был представлен, я думаю, что хороший подход заключается в следующем:

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;
        }
    }

}
14 голосов
/ 30 марта 2012

Как насчет этого?

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;
            }
        }
    }
}
12 голосов
/ 11 марта 2015

Пример кода с использованием goto и меткой для выхода из вложенного цикла:

for (;;)
  for (;;)
    goto theEnd;
theEnd:
9 голосов
/ 12 июня 2013

Один хороший способ вырваться из нескольких вложенных циклов - это преобразовать код в функцию:

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;
            }
        }
    }
}
5 голосов
/ 27 сентября 2016

goto может быть очень полезно для разрыва вложенных циклов

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
...