Різниця між перервою та продовженням заяви


266

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

Відповіді:


530

breakзалишає петлю, continueпереходить до наступної ітерації.


3
Зауважте, що Java також містить мічені заяви продовження / перерви, які мають різну семантику :-)
Jay

4
Це лише основи перерви та продовження. Для кращого пояснення погляньте на повідомлення Джея
Xn0vv3r

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

"Перерва" також припинить оператор переключення
samsamara

1
буде продовжувати переходити до наступної ітерації, навіть якщо вона є в операторі if if всередині кожного циклу?
клатч

102

Докладнішу інформацію та зразки коду див. У розділах Виписки :

break

Заява про перерву має дві форми: марковану та без маркування. Ви побачили незазначену форму в попередньому обговоренні заяви переключення. Ви також можете використати незазначений перерву для припинення циклу для, в той час, або під час виконання циклу [...]

Немальований оператор перерви припиняє найпотужніший комутатор for, while, або do-while, але мічений перерва припиняє зовнішнє твердження.

continue

Оператор продовження пропускає поточну ітерацію циклу for, while або do-while. Немечена форма пропускається до кінця тіла найпотаємнішої петлі і оцінює булевий вираз, який керує циклом. [...]

Позначений оператор продовження пропускає поточну ітерацію зовнішньої петлі, позначеної даною міткою.


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

Перерва залишає цикл повністю і виконує операції після циклу. Тоді як 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пропускає заяви після оператора продовження і продовжує циклічно.


12

Заява про перерву

Іноді необхідно вийти з циклу перш ніж цикл повністю завершить ітерацію над усіма значеннями кроку. Наприклад, перебираючи список номерів, поки не знайдете число, яке відповідає певній умові. Або циклічно перебираючи потік символів з файлу, поки певний символ не буде прочитаний.

У наступному прикладі ми використовуємо простий цикл для друку значень від 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 для виходу з циклів, а циклів і циклів do-while. Заява перерви вириватиметься лише з поточного циклу. Для того, щоб вирвати зовнішній цикл із вкладеного внутрішнього циклу, вам потрібно буде використовувати мітки із заявою break.

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

Вихід:

0
1
2
3
4

Продовжити заяву

Повідомлення продовження Java пропускає поточну ітерацію циклу і переходить безпосередньо до наступної ітерації. Після виклику оператора продовження у циклі 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

Мітка циклу - Заява про розрив Ви можете використовувати мітки в межах вкладених циклів , вказавши, де потрібно продовжити виконання після виривання з внутрішньої петлі. Зазвичай оператор 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;" вирватися із зовнішньої самої петлі.

Мітки циклу - продовження заяви

Ви також можете використовувати мітки з ключовим словом «продовжити», щоб продовжити цикл із певної точки. Якщо взяти попередній приклад і просто змінити один рядок, щоб вказати 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 - Ultimate Guide


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

Розрив призводить до припинення циклу і значення n дорівнює 0.

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

Продовження призводить до повернення лічильника програми до першого рядка циклу (умова перевіряється і значення n збільшується) та кінцеве значення n дорівнює 10.

Слід також зазначити, що розрив лише припиняє виконання циклу, який знаходиться в межах:

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

Так, я просто пояснюю семантику перерви і продовжую :-)
Майкл Буен

1
Ви нічого не пояснюєте, ви просто розмістили якийсь код. Навіть не коментований код. Шматок коду не є поясненням або «семантичним».
Маркіз Лорн

1

По-перше, я думаю, ви повинні знати, що в Java існує два типи перерви і продовження, які мають мітку break, unlabeled break, labeled continue та unlabeled continue.Зараз я розповім про різницю між ними.

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

Немальований оператор перерви припиняє найпотужніший комутатор для оператора do, 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.");
}

Немальований оператор продовження пропускає поточну ітерацію оператора 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
        }
    }
}

Позначений оператор продовження пропускає поточну ітерацію зовнішньої петлі, позначеної даною міткою, якщо javac та java demo ви отримаєте:

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

Простіше кажучи: перерва припинить поточний цикл і продовжить виконання в першому рядку після закінчення циклу. продовжити стрибки назад до стану циклу і продовжує працювати цикл.


При першій заяві після циклу.
Маркіз Лорн

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

Продовжити Statment зупинити ітерацію та розпочати наступну ітерацію Приклад:

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

значить, ви знаходитесь всередині циклу для або під час. Використання перерви; поставить вас поза петлею. Як і в, це закінчиться. Продовжуйте; підкаже, щоб запустити наступну ітерацію.

Немає сенсу використовувати продовжувати, якщо оператор if, але перервати; корисно. У переключенні ... випадку, завжди використовуйте перерву; закінчити справу, тому вона не виконує іншу справу.


1
"Немає сенсу використовувати продовжувати, якщо заява" - Так, це має сенс. Наприклад, коли виконується умова, ви можете пропустити деякі деталі обробки на фактичному етапі ітерації.
Sk8erPeter

Це не тільки безглуздо , але незаконно, якщоif не всередині циклу, і в цьому випадку є багато точки.
Маркіз Лорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.