Оператор break внутри двух циклов while

Допустим, у меня есть это:

while (a) {
  while (b) {
    if (b == 10) {
      break;
    }
  }
}

Вопрос: оператор break выведет меня из обоих циклов или только из внутреннего? Спасибо.


person adrian    schedule 12.09.2012    source источник
comment
Если вы хотите выйти из двух вложенных циклов while, вы можете использовать метки... docs.microsoft.com/en-us/dotnet/csharp/language-reference/   -  person Ivandro Jao    schedule 11.10.2020


Ответы (11)


В вашем примере инструкция break выведет вас из цикла while(b)

while(a) {

   while(b) {

      if(b == 10) {
         break;
      }
   }  
   // break will take you here.
}
person Abhishekkumar    schedule 12.09.2012
comment
Что, если я хочу также сломать while-A? - person oneofakind; 19.06.2014
comment
@oneofakind, вы можете использовать еще один оператор break, в котором записывается строка с комментариями. - person Abhishekkumar; 19.12.2014
comment
@oneofakind, если вы хотите выйти из обоих циклов, поместите метку, например, внешнее, на первое время, а затем используйте разрыв внешнего; прорваться на этот уровень. См.: gist.github.com/bseib/f5ee5c5baa31fa116feb715bd4037cb5 - person broc.seib; 05.10.2018

Он сломает только самый непосредственный цикл while. Используя метку, вы можете выйти из обоих циклов: взгляните на этот пример, взятый из здесь


public class Test {
  public static void main(String[] args) {
    outerloop:
    for (int i=0; i < 5; i++) {
      for (int j=0; j < 5; j++) {
        if (i * j > 6) {
          System.out.println("Breaking");
          break outerloop;
        }
        System.out.println(i + " " + j);
      }
    }
    System.out.println("Done");
  }
}
person Ivan Koblik    schedule 12.09.2012
comment
Лучше использовать флаги вместо меток, потому что это может легко привести к sphagetti-коду. - person Shafi; 13.09.2012
comment
Я бы пошел еще дальше и сказал, что лучше использовать функции и просто возвращаться из внутреннего цикла. - person Ivan Koblik; 13.09.2012

Только из внутреннего. Используйте обозначенный разрыв, если вы хотите прервать определенный цикл

label1:
for(){
  label2:
  for(){
      if(condition1)
      break label1;//break outerloop

      if(condition2)
      break label2;//break innerloop
  }
}

См. также

person jmj    schedule 12.09.2012

@Абхишеккумар

Ключевое слово Break имеет производный корень из C и Assembly, а единственная цель Break — передать управление из составного оператора, то есть цикла, условия, метода или процедур.

Пожалуйста, обратитесь к этим...

http://tigcc.ticalc.org/doc/keywords.html#break

http://www.functionx.com/cpp/keywords/break.htm

http://en.wikipedia.org/wiki/Break_statement#Early_exit_from_loops

Итак, если вы хотите выйти из двух циклов одновременно, вам нужно использовать два разрыва, то есть один во внутреннем цикле и один во внешнем цикле.

Но вы хотите остановить оба цикла одновременно, тогда вам придется использовать выход или возврат.

person Community    schedule 13.09.2012

while (a) {

   while (b) {

      if (b == 10) {
          break;
      }
   }
}

В приведенном выше коде вы разорвете самый внутренний цикл, где (т.е. immediate loop) где break используется.

Вы можете разорвать обе петли одновременно, используя break с label

label1: 
while (a) {

   while (b) {

      if (b == 10) {
          break label1;
      }
   }
}
person Kumar Vivek Mitra    schedule 12.09.2012

Он вырвется из петли, которая его сразу окружает.

Однако вы можете перейти к метке:

myLabel:

while(a) {    
    while(b) {    
        if(b == 10)
            break myLabel;
    }
}

Обычно я не люблю использовать этот шаблон, потому что он легко приводит к спагетти-коду. Используйте немаркированный разрыв или флаг, чтобы завершить цикл.

person Vivin Paliath    schedule 12.09.2012

Любопытно, что в PHP оператор break принимает числовой параметр, который сообщает, сколько внешних циклов вы хотите прервать, например:

$i = 0;
while (++$i) {
   switch ($i) {
      case 5:
         echo "At 5<br />\n";
         break 1;  /* Exit only the switch. */
      case 10:
         echo "At 10; quitting<br />\n";
         break 2;  /* Exit the switch and the while. */
      default:
         break;
  }
}
person Nelson    schedule 12.09.2012

Вы можете поднять флаг, чтобы передать информацию во внешний цикл while. В этом случае информация может храниться в переменной breakOuterLoopFlag и внешний цикл while действует в соответствии с этой информацией. См. псевдокод ниже:

int breakOuterLoopFlag = 0;

while(a){
   
  while(b){
      if(b == 10) {
        breakOuterLoopFlag = 1;
        break;
      }
    }

   if(breakOuterLoopFlag == 1) {
     break;
   }
}
person TechJ    schedule 11.09.2019

Оператор break выведет вас из самого внутреннего цикла, содержащего этот оператор break.

В примере внутренний цикл while.

person Bhesh Gurung    schedule 12.09.2012

Оператор java break не выведет вас из нескольких вложенных циклов.

person main--    schedule 12.09.2012

Только внутренний цикл, конечно.

person Debloper    schedule 12.09.2012