Разница между перерывом и продолжением


266

Может кто - нибудь сказать мне разницу между breakи continueутверждениями?

Ответы:


531

breakвыходит из цикла, continueпереходит к следующей итерации.


3
Обратите внимание, что Java также содержит помеченные операторы continue / break, которые имеют различную семантику :-)
Jay

4
Это всего лишь основы перерыва и продолжения. Для лучшего объяснения, посмотрите на сообщение Джея
Xn0vv3r

1
Для тех, кто интересуется, чтобы использовать метку, вы пишете название метки с последующим «:» перед циклом.
Caelum

«break» также прервет оператор switch
samsamara

1
продолжит переход к следующей итерации, даже если он находится в операторе if else внутри каждого цикла?
сцепление

102

Посмотрите Ветвящиеся Заявления для получения дополнительной информации и примеров кода:

break

Оператор break имеет две формы: помеченный и немаркированный. Вы видели немаркированную форму в предыдущем обсуждении оператора switch. Вы также можете использовать немаркированный разрыв для завершения цикла for, while или do-while [...]

Оператор без метки прерывает самый внутренний переключатель for, while или do-while, но помеченный разрыв завершает внешнюю инструкцию.

continue

Оператор continue пропускает текущую итерацию цикла for, while или do-while. Немеченая форма пропускается до конца тела самого внутреннего цикла и оценивает логическое выражение, которое управляет циклом. [...]

Помеченный оператор continue пропускает текущую итерацию внешнего цикла, помеченного данной меткой.


66
System.out.println ("starting loop:");
for (int n = 0; n < 7; ++n)
{
    System.out.println ("in loop: " + n);
    if (n == 2) {
        continue;
    }
    System.out.println ("   survived first guard");
    if (n == 4) {
        break;
    }
    System.out.println ("   survived second guard");
    // continue at head of loop
}
// break out of loop
System.out.println ("end of loop or exit via break");

Это приведет к следующему выводу:

starting loop:
in loop: 0
    survived first guard
    survived second guard
in loop: 1
    survived first guard
    survived second guard
in loop: 2
in loop: 3
    survived first guard
    survived second guard
in loop: 4
    survived first guard
end of loop or exit via break

Вы можете пометить блок, а не только цикл for, а затем разорвать / продолжить переход от вложенного блока к внешнему. В некоторых случаях это может быть полезно, но в целом вы будете стараться избегать такого кода, за исключением того, что логику программы гораздо лучше понять, чем в следующем примере:

first:
for (int i = 0; i < 4; ++i) 
{
    second:
    for (int j = 0; j < 4; ++j) 
    {
        third:
        for (int k = 0; k < 4; ++k) 
        {
            System.out.println ("inner start: i+j+k " + (i + j + k));
            if (i + j + k == 5)
                continue third;
            if (i + j + k == 7)
                continue second;
            if (i + j + k == 8)
                break second;
            if (i + j + k == 9)
                break first;
            System.out.println ("inner stop:  i+j+k " + (i + j + k));
        }
    }       
}

Потому что это возможно, это не значит, что вы должны его использовать.

Если вы хотите смешным образом запутать свой код, вы выбираете не значимое имя, а http: и сопровождаете его комментарием, который выглядит чуждо, как веб-адрес в исходном коде:

http://stackoverflow.com/questions/462373
for (int i = 0; i < 4; ++i) 
{
     if (i == 2) 
         break http;

Я предполагаю, что это от насмешки Джошуа Блоха. :)


1
Отличная идея с омрачением, разве не просто http://stackoverflow.com/questions/462373/работа?
Caelum

@ user2104648: да, это, должно быть, ошибка вставки 'n'.
пользователь неизвестен

28

Break полностью покидает цикл и выполняет операторы после цикла. Принимая во внимание, что Continue оставляет текущую итерацию и выполняется со следующим значением в цикле.

Этот код объясняет все:

public static void main(String[] args) {
    for(int i=0;i<10;i++)
    {
        if (i==4)
        {
            break;
        }
        System.out.print(i+"\t");

    }
    System.out.println();
    for(int i=0;i<10;i++)
    {

        if (i==4)
        {
            continue;
        }
        System.out.print(i+"\t");
    }
}

Вывод:

0   1   2   3   
0   1   2   3   5   6   7   8   9

24

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


12

Перерыв Заявление

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

В следующем примере мы используем простой цикл for для вывода значений от 0 до 9:

for(int i=0; i<10; i++) {
  System.out.println(i);
}

Вывод:

0
1
2
3
4
5
6
7
8
9

Теперь, если мы добавим оператор break, когда i == 4, наш код выйдет из цикла, как только я равняюсь 4. Вы можете использовать оператор break для выхода из циклов for, while и циклов do-while. Оператор break будет выходить только из текущего цикла. Чтобы выйти из внешнего цикла из вложенного внутреннего цикла, вам необходимо использовать метки с оператором break.

for(int i=0; i<10; i++) {
  System.out.println(i);
  if(i==4) {
    break;
  }
}

Вывод:

0
1
2
3
4

Продолжить заявление

Оператор continue Java пропускает текущую итерацию цикла и переходит непосредственно к следующей итерации. После вызова оператора continue в цикле for выполнение цикла выполнит значение шага и оценит логическое условие, прежде чем перейти к следующей итерации. В следующем примере мы распечатываем все значения от 0 до 9 в цикле, но пропускаем печать 4.

for(int i=0; i<10; i++) {
  if(i==4) {
    continue;
  }
  System.out.println(i);
}

Вывод:

0
1
2
3
5 <---- SKIPPED OVER 4 and continued with next loop iteration
6
7
8
9

Loop Label - Break Break Вы можете использовать метки во вложенных циклах оператор , указав, где вы хотите продолжить выполнение после выхода из внутреннего цикла. Обычно оператор break будет выходить только из самого внутреннего цикла, поэтому, когда вы хотите выйти из внешнего цикла, вы можете использовать метки для достижения этой цели, по сути, делая что-то похожее на оператор goto.

В следующем примере используются 3 цикла, все они вложены друг в друга. Поскольку нет никакого способа полностью выйти из самого внешнего цикла изнутри самого внутреннего цикла, мы можем использовать метку «external1» для выполнения этого и указать метку рядом с оператором break.

outer1:
for(int i=0; i<5; i++) {
  for(int j=0; j<4; j++) {
    for(int k=0; k<2; k++) {
      System.out.println("[" + i + "][" + j + "][" + k + "]");
      if(j == 3) {
        break outer1;
      }
    }
  }
}

Вывод:

[0][0][0]
[0][0][1]
[0][1][0]
[0][1][1]
[0][2][0]
[0][2][1]
[0][3][0]

Обратите внимание, что последняя отображаемая строка имеет вид « 0 [0]», где j == 3, и именно здесь мы назвали «break external1;» вырваться из внешней петли.

Loop Labels - Продолжить заявление

Вы также можете использовать метки с ключевым словом continue для продолжения цикла с определенной точки. Взяв предыдущий пример и просто изменив одну строку для указания continue outer1;вместо, break outer1;вы заставите цикл продолжать цикл с outer1метки вместо выхода из цикла. Обратите внимание, что каждый раз, когда continue outer1;вызывается, код продолжается из внешнего цикла после увеличения индекса цикла i на 1.

outer1:
for(int i=0; i<5; i++) {
  for(int j=0; j<4; j++) {
    for(int k=0; k<2; k++) {
      System.out.println("[" + i + "][" + j + "][" + k + "]");
      if(j == 3) {
        continue outer1;
    }
  }
}

[0][0][0]
[0][0][1]
[0][1][0]
[0][1][1]
[0][2][0]
[0][2][1]
[0][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[1][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[1][0][1]
[1][1][0]
[1][1][1]
[1][2][0]
[1][2][1]
[1][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[2][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[2][0][1]
[2][1][0]
[2][1][1]
[2][2][0]
[2][2][1]
[2][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[3][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[3][0][1]
[3][1][0]
[3][1][1]
[3][2][0]
[3][2][1]
[3][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[4][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[4][0][1]
[4][1][0]
[4][1][1]
[4][2][0]
[4][2][1]
[4][3][0]

Источник: циклы в Java - полное руководство


7

Отличный ответ простой и точный.

Я бы добавил пример кода.

C:\oreyes\samples\java\breakcontinue>type BreakContinue.java

    class BreakContinue {

        public static void main( String [] args ) {

               for( int i = 0 ; i < 10 ; i++ ) {

                     if( i % 2 == 0) { // if pair, will jump
                         continue; // don't go to "System.out.print" below.
                     }

                     System.out.println("The number is " + i );

                     if( i == 7 ) {
                         break; // will end the execution, 8,9 wont be processed
                      }

               }
        }

    }

C:\oreyes\samples\java\breakcontinue>java BreakContinue
The number is 1
The number is 3
The number is 5
The number is 7

6

А breakзаявление приводит к прекращению заявления , к которому он относится ( switch, for, doили while).

continueЗаявление используются для завершения текущей итерации цикла и возвращает управление оператором цикла.


5

continueпропускает ток , выполняющий цикл и переходит к следующему цикла , тогда break выходит из цикла и выполняет следующий оператор после цикла. Я узнал разницу, используя следующий код. Проверьте различные выводы. Надеюсь, это поможет.

public static void main(String[] args) {
    for(int i = 0; i < 5; i++){
        if (i == 3) {
            continue;
        }
        System.out.print(i);
    }
}//prints out 0124, continue moves to the next iteration skipping printing 3

public static void main(String[] args) {
    for(int i = 0; i < 5; i++){
        if (i == 3) {
            break;
        }
        System.out.print(i);
    }
}//prints out 012, break moves out of the loop hence doesnt print 3 and 4

4

Учтите следующее:

int n;
for(n = 0; n < 10; ++n) {
    break;
}
System.out.println(n);

break приводит к завершению цикла, и значение n равно 0.

int n;
for(n = 0; n < 10; ++n) {
    continue;
}
System.out.println(n);

продолжение заставляет счетчик программы вернуться к первой строке цикла (условие проверяется, а значение n - это приращение) и конечное значение n равно 10.

Также следует отметить, что break только завершает выполнение цикла, в котором он находится:

int m;
for(m = 0; m < 5; ++m)
{
    int n;
    for(n = 0; n < 5; ++n) {
        break;
    }
    System.out.println(n);
}
System.out.println(m);

Будет выводить что-то с эффектом

0
0
0
0
0
5

1
У вас есть переменные проблемы с областями видимости в ваших примерах.
Даррон

3

В breakзаявлении прорывается из цикла (следующий оператор , чтобы быть выполнены является первым после закрывающей скобки), в то время как continueначинается петля над на следующей итерации.


2

breakУтверждение существует текущую структуру управления сквозного и прыгает за ним в то время как continueвыходы тоже , но прыгает обратно в обхвате состояния.


2

Простой пример:

break выходит из цикла.

int m = 0;
for(int n = 0; n < 5; ++n){
  if(n == 2){
    break;
  }
  m++;
}

System.out.printl("m:"+m); // m:2

continue вернусь к началу цикла.

int m = 0;
for(int n = 0; n < 5; ++n){
  if(n == 2){
    continue; // Go back to start and dont execute m++
  }
  m++;
}

System.out.printl("m:"+m); // m:4

2

Чтобы предотвратить выполнение чего-либо, если условие выполнено, следует использовать продолжение, а для выхода из цикла, если условие выполнено, следует использовать разрыв.

Например, в приведенном ниже коде.

 for(int i=0;i<5;i++){

        if(i==3){

           continue;

        }
       System.out.println(i);
     }

Приведенный выше код напечатает результат: 0 1 2 4

Теперь рассмотрим этот код

 for(int i=0;i<5;i++){


            if(i==3){

                break;

            }
            System.out.println(i);
         }

Этот код напечатает 0 1 2

В этом основная разница в продолжении и разрыве.


1

вот семантика разрыва:

int[] a = new int[] { 1, 3, 4, 6, 7, 9, 10 };
// find 9
for(int i = 0; i < a.Length; i++)
{
    if (a[i] == 9) 
        goto goBreak;

    Console.WriteLine(a[i].ToString());      
}
goBreak:;

вот семантика продолжения:

int[] a = new int[] { 1, 3, 4, 6, 7, 9, 10 };
// skip all odds
for(int i = 0; i < a.Length; i++)
{
    if (a[i] % 2 == 1) 
        goto goContinue;

    Console.WriteLine(a[i].ToString());      

goContinue:;
}

У C # нет перерыва; и продолжить; заявления? Я не могу в это поверить.
OscarRyz

Да, C # есть, я просто объясняю семантику break и продолжаю :-)
Michael Buen

1
Вы ничего не объясняете, вы только что опубликовали код. Даже не прокомментированный код. Кусок кода не является объяснением или «семантикой».
маркиз Лорн

1

Во-первых, я думаю, вы должны знать, что в Java есть два типа разрыва и продолжения, которые помечены как разрыв, немаркированный разрыв, помеченный как продолжение и непомеченный продолжение. Теперь я расскажу о разнице между ними.

class BreakDemo {
public static void main(String[] args) {

    int[] arrayOfInts = 
        { 32, 87, 3, 589,
          12, 1076, 2000,
          8, 622, 127 };
    int searchfor = 12;

    int i;
    boolean foundIt = false;

    for (i = 0; i < arrayOfInts.length; i++) {
        if (arrayOfInts[i] == searchfor) {
            foundIt = true;
            break;//this is an unlabeled break,an unlabeled break statement terminates the innermost switch,for,while,do-while statement.
        }
    }

    if (foundIt) {
        System.out.println("Found " + searchfor + " at index " + i);
    } else {
        System.out.println(searchfor + " not in the array");
    }
}

Незамеченный оператор break завершает самый внутренний переключатель для оператора while, while.

public class BreakWithLabelDemo {
public static void main(String[] args) {
    search:
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            System.out.println(i + " - " + j);
            if (j == 3)
                break search;//this is an labeled break.To notice the lab which is search.
        }
    }
}

Помеченный разрыв завершает внешнюю инструкцию. Если вы javac и java в этой демонстрации, вы получите:

0 - 0
0 - 1
0 - 2
0 - 3
class ContinueDemo {
public static void main(String[] args) {

    String searchMe = "peter piper picked a " + "peck of pickled peppers";
    int max = searchMe.length();
    int numPs = 0;

    for (int i = 0; i < max; i++) {
        // interested only in p's
        if (searchMe.charAt(i) != 'p')
            continue;//this is an unlabeled continue.

        // process p's
        numPs++;
    }
    System.out.println("Found " + numPs + " p's in the string.");
}

Непомеченный оператор continue пропускает текущую итерацию оператора for, while, do-while.

public class ContinueWithLabelDemo {
public static void main(String[] args) {
    search:
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            System.out.println(i + " - " + j);
            if (j == 3)
                continue search;//this is an labeled continue.Notice the lab which is search
        }
    }
}

Помеченный оператор continue пропускает текущую итерацию внешнего цикла, помеченного данной меткой, если вы javac и java демо, вы получите:

0 - 0
0 - 1
0 - 2
0 - 3
1 - 0
1 - 1
1 - 2
1 - 3
2 - 0
2 - 1
2 - 2
2 - 3

если у вас есть какие-либо вопросы, вы можете посмотреть учебник по Java этого: введите описание ссылки здесь


0

Проще говоря: break прервет текущий цикл и продолжит выполнение на первой строке после завершения цикла. continue переходит обратно в состояние цикла и продолжает работу цикла.


При первом утверждении после цикла.
Маркиз Лорн

0
for (int i = 1; i <= 3; i++) {
        if (i == 2) {

            continue;
        }
        System.out.print("[i:" + i + "]");

попробуйте этот код в netbeans, вы поймете разницу между перерывом и продолжением

for (int i = 1; i <= 3; i++) {
        if (i == 2) {

            break;
        }
        System.out.print("[i:" + i + "]");

0

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

Когда continueиспользуется

    public static void main(String[] args) {
    System.out.println("HelloWorld");
    for (int i = 0; i < 5; i++){
        System.out.println("Start For loop i = " + i);
        if(i==2){
            System.out.println("Inside if Statement for i = "+i);
           continue;
        }
        System.out.println("End For loop i = " + i);
    }
    System.out.println("Completely out of For loop");
}


OutPut:
HelloWorld
Start For loop i = 0
End For loop i = 0
Start For loop i = 1
End For loop i = 1
Start For loop i = 2
Inside if Statement for i = 2
Start For loop i = 3
End For loop i = 3
Start For loop i = 4
End For loop i = 4
Completely out of For loop

Когда breakиспользуется

public static void main(String[] args) {
    System.out.println("HelloWorld");
    for (int i = 0; i < 5; i++){
        System.out.println("Start For loop i = " + i);
        if(i==2){
            System.out.println("Inside if Statement for i = "+i);
           break;
        }
        System.out.println("End For loop i = " + i);
    }
    System.out.println("Completely out of For loop");
}

Output:
HelloWorld
Start For loop i = 0
End For loop i = 0
Start For loop i = 1
End For loop i = 1
Start For loop i = 2
Inside if Statement for i = 2
Completely out of For loop

0

Продолжить задание остановить итерацию и начать следующую итерацию Пример:

System.out.println("continue when i is 2:");
    for (int i = 1; i <= 3; i++) {
        if (i == 2) {
            System.out.print("[continue]");
            continue;
        }
        System.out.print("[i:" + i + "]");
    }

и Break Statment остановить цикл или выйти из цикла


-1

так что вы внутри цикла for или while. Используя перерыв; поставит вас за пределы петли. Как и в, это закончится. Продолжать; скажет ему запустить следующую итерацию.

Нет смысла использовать продолжить в операторе if, но перерыв; является полезным. В случае switch ... всегда используйте break; чтобы завершить дело, чтобы он не выполнял другое дело.


1
«Нет смысла использовать продолжение в операторе if» - да, это имеет смысл. Например, когда условие выполнено, вы можете пропустить некоторые части обработки на действительном шаге итерации.
Sk8erPeter

Это не только бессмысленно , но незаконно, еслиif не находится внутри цикла, и в этом случае есть много точки.
Маркиз Лорн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.