Sự khác biệt giữa tuyên bố phá vỡ và tiếp tục


266

Bất cứ ai có thể cho tôi biết sự khác biệt giữa breakcontinuetuyên bố?

Câu trả lời:


531

breakđể lại một vòng lặp, continuenhảy đến lần lặp tiếp theo.


3
Lưu ý rằng Java cũng chứa các câu lệnh tiếp tục / ngắt có nhãn có ngữ nghĩa khác nhau :-)
Jay

4
Đây chỉ là những điều cơ bản của phá vỡ và tiếp tục. Để được giải thích rõ hơn, hãy xem bài viết của Jay
Xn0vv3r

1
Đối với những người thắc mắc, để sử dụng nhãn bạn viết tên nhãn theo sau ':' trước một vòng lặp.
Caelum

"break" cũng sẽ chấm dứt một câu lệnh chuyển đổi
samsamara

1
sẽ tiếp tục nhảy đến lần lặp tiếp theo ngay cả khi nó nằm trong câu lệnh if khác bên trong a cho mỗi vòng lặp?
klutch

102

Xem Báo cáo phân nhánh để biết thêm chi tiết và mẫu mã:

break

Tuyên bố phá vỡ có hai hình thức: dán nhãn và không nhãn. Bạn đã thấy biểu mẫu chưa được gắn nhãn trong cuộc thảo luận trước đây về câu lệnh chuyển đổi. Bạn cũng có thể sử dụng dấu ngắt không được gắn nhãn để chấm dứt vòng lặp for, while hoặc do-while [...]

Một câu lệnh ngắt không được gắn nhãn sẽ chấm dứt chuyển đổi trong cùng, cho, trong khi hoặc do-while, nhưng một dấu ngắt được gắn nhãn sẽ chấm dứt một câu lệnh bên ngoài.

continue

Câu lệnh continue bỏ qua lần lặp hiện tại của một vòng lặp for, while hoặc do-while. Biểu mẫu không được gắn nhãn bỏ qua đến cuối cơ thể của vòng lặp trong cùng và đánh giá biểu thức boolean điều khiển vòng lặp. [...]

Một câu lệnh tiếp tục được gắn nhãn bỏ qua bước lặp hiện tại của một vòng lặp bên ngoài được đánh dấu bằng nhãn đã cho.


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

Điều này sẽ dẫn đến đầu ra sau:

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

Bạn có thể gắn nhãn cho một khối, không chỉ là một vòng lặp for, sau đó ngắt / tiếp tục từ một khối lồng nhau sang một khối bên ngoài. Trong một số trường hợp, điều này có thể hữu ích, nhưng nói chung, bạn sẽ cố gắng tránh mã đó, ngoại trừ logic của chương trình sẽ tốt hơn nhiều so với trong ví dụ sau:

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

Bởi vì điều đó là có thể, điều đó không có nghĩa là bạn nên sử dụng nó.

Nếu bạn muốn làm xáo trộn mã của mình theo một cách hài hước, bạn không chọn một tên có ý nghĩa, nhưng http: và theo dõi nó với một nhận xét, trông giống người ngoài hành tinh, giống như một webadress trong mã nguồn:

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

Tôi đoán đây là từ một câu đố Joshua Bloch. :)


1
Ý tưởng tuyệt vời với sự ám ảnh, sẽ không có http://stackoverflow.com/questions/462373/công việc quá?
Caelum

@ user2104648: có, đó chắc chắn là lỗi dán 'n'.
người dùng không xác định

28

Break rời khỏi vòng lặp hoàn toàn và thực hiện các câu lệnh sau vòng lặp. Trong khi Tiếp tục rời khỏi vòng lặp hiện tại và thực hiện với giá trị tiếp theo trong vòng lặp.

Mã này giải thích mọi thứ:

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

Đầu ra:

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

24

breakhoàn toàn thoát khỏi vòng lặp. continuebỏ qua các câu lệnh sau câu lệnh continue và tiếp tục lặp.


12

Tuyên bố phá vỡ

Đôi khi cần phải thoát khỏi một vòng lặp trước khi vòng lặp hoàn thành lặp lại trên tất cả các giá trị bước. Ví dụ: lặp qua danh sách các số cho đến khi bạn tìm thấy một số thỏa mãn một điều kiện nhất định. Hoặc lặp qua một luồng các ký tự từ một tệp cho đến khi một ký tự nào đó được đọc.

Trong ví dụ sau, chúng tôi đang sử dụng một vòng lặp for đơn giản để in ra các giá trị từ 0 đến 9:

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

Đầu ra:

0
1
2
3
4
5
6
7
8
9

Bây giờ nếu chúng ta thêm một câu lệnh break khi i == 4, mã của chúng ta sẽ thoát ra khỏi vòng lặp một khi tôi bằng 4. Bạn có thể sử dụng câu lệnh break để thoát ra khỏi các vòng lặp, trong khi các vòng lặp và vòng lặp do-while. Câu lệnh break sẽ chỉ thoát ra khỏi vòng lặp hiện tại. Để thoát ra khỏi vòng lặp bên ngoài từ vòng lặp bên trong lồng nhau, bạn sẽ cần sử dụng nhãn với câu lệnh break.

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

Đầu ra:

0
1
2
3
4

Tiếp tục tuyên bố

Câu lệnh tiếp tục của Java bỏ qua lần lặp hiện tại của một vòng lặp và đi thẳng đến lần lặp tiếp theo. Sau khi gọi câu lệnh continue trong một vòng lặp for, việc thực hiện vòng lặp sẽ thực hiện giá trị bước và đánh giá điều kiện boolean trước khi tiến hành lần lặp tiếp theo. Trong ví dụ sau, chúng tôi sẽ in ra tất cả các giá trị từ 0 đến 9 trong một vòng lặp nhưng chúng tôi bỏ qua việc in ra 4.

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

Đầu ra:

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

Nhãn vòng lặp - Tuyên bố phá vỡ Bạn có thể sử dụng nhãn trong các vòng lặp lồng nhau bằng cách chỉ định nơi bạn muốn thực hiện tiếp tục sau khi thoát ra khỏi vòng lặp bên trong. Thông thường, câu lệnh break sẽ chỉ thoát ra khỏi vòng lặp trong cùng, vì vậy khi bạn muốn thoát ra khỏi vòng lặp bên ngoài, bạn có thể sử dụng nhãn để thực hiện điều này, về cơ bản là thực hiện một thao tác tương tự như câu lệnh goto.

Ví dụ sau sử dụng 3 vòng lặp, tất cả được lồng vào nhau. Vì không có cách nào hoàn toàn thoát ra khỏi vòng lặp bên ngoài nhất từ ​​bên trong vòng lặp bên trong nhất, chúng ta có thể sử dụng nhãn bên ngoài11 để thực hiện điều này và chỉ định nhãn bên cạnh câu lệnh 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;
      }
    }
  }
}

Đầu ra:

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

Lưu ý cách dòng cuối cùng được hiển thị là 0 [0], đó là nơi j == 3 và đó là nơi chúng tôi gọi là đường gãy ngoài1; để thoát ra khỏi vòng lặp bên ngoài nhất.

Nhãn vòng lặp - Tiếp tục tuyên bố

Bạn cũng có thể sử dụng nhãn với từ khóa tiếp tục để tiếp tục lặp từ một điểm cụ thể. Lấy ví dụ trước và chỉ thay đổi một dòng để chỉ định continue outer1;thay vì break outer1;sẽ khiến vòng lặp tiếp tục lặp từ outer1nhãn thay vì thoát ra khỏi vòng lặp. Lưu ý cách mỗi lần continue outer1;được gọi, mã tiếp tục từ vòng lặp bên ngoài sau khi tăng chỉ số vòng lặp i lên 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]

Nguồn: Vòng lặp trong Java - Hướng dẫn cơ bản


7

Câu trả lời tuyệt vời đơn giản và chính xác.

Tôi sẽ thêm một mẫu mã.

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

Một breaktuyên bố kết quả trong việc chấm dứt các tuyên bố mà nó áp dụng ( switch, for, do, hoặc while).

Một continuecâu lệnh được sử dụng để kết thúc vòng lặp hiện tại và điều khiển trả về câu lệnh lặp.


5

continuebỏ qua vòng lặp thực thi hiện tại và chuyển sang vòng lặp tiếp theo trong khi break MOVES OUT của vòng lặp và thực hiện câu lệnh tiếp theo sau vòng lặp. Tôi đã học được sự khác biệt bằng cách sử dụng mã sau đây. Kiểm tra các đầu ra khác nhau. Hy vọng điều này sẽ giúp.

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

Hãy xem xét những điều sau đây:

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

phá vỡ làm cho vòng lặp chấm dứt và giá trị của n là 0.

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

tiếp tục làm cho bộ đếm chương trình trở về dòng đầu tiên của vòng lặp (điều kiện được kiểm tra và giá trị của n là tăng) và giá trị cuối cùng của n là 10.

Cũng cần lưu ý rằng ngắt chỉ chấm dứt việc thực hiện vòng lặp trong vòng:

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

Sẽ tạo ra một cái gì đó để có hiệu lực của

0
0
0
0
0
5

1
Bạn đã có các vấn đề phạm vi biến trong các ví dụ của bạn.
Darron

3

Câu breaklệnh thoát ra khỏi vòng lặp (câu lệnh tiếp theo được thực hiện là câu lệnh đầu tiên sau dấu ngoặc đóng), trong khi continuebắt đầu vòng lặp ở lần lặp tiếp theo.


2

Câu breaklệnh tồn tại cấu trúc điều khiển vòng lặp hiện tại và nhảy phía sau nó trong khi continuethoát quá nhưng nhảy trở lại điều kiện lặp.


2

Ví dụ đơn giản:

break rời khỏi vòng lặp.

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

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

continue sẽ quay trở lại để bắt đầu vòng lặp.

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

Để ngăn chặn bất cứ điều gì thực hiện nếu một điều kiện được đáp ứng, người ta nên sử dụng tiếp tục và để thoát khỏi vòng lặp nếu một điều kiện được đáp ứng, người ta nên sử dụng ngắt.

Ví dụ trong mã được đề cập dưới đây.

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

        if(i==3){

           continue;

        }
       System.out.println(i);
     }

Đoạn mã trên sẽ in kết quả: 0 1 2 4

KHÔNG xem xét mã này

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


            if(i==3){

                break;

            }
            System.out.println(i);
         }

Mã này sẽ in 0 1 2

Đó là sự khác biệt cơ bản trong việc tiếp tục và phá vỡ.


1

đây là ngữ nghĩa của sự phá vỡ:

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

đây là ngữ nghĩa của tiếp tục:

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

Không C # có nghỉ; và tiếp tục; các câu lệnh? Tôi không thể tin được.
OscarRyz

Vâng C # có, tôi chỉ giải thích ngữ nghĩa của sự phá vỡ và tiếp tục :-)
Michael Buen

1
Bạn không giải thích bất cứ điều gì, bạn chỉ cần đăng một số mã. Thậm chí không nhận xét mã. Một đoạn mã không phải là một lời giải thích, hay một "ngữ nghĩa".
Hầu tước Lorne

1

Đầu tiên, tôi nghĩ bạn nên biết rằng có hai loại phá vỡ và tiếp tục trong Java được gắn nhãn là phá vỡ, phá vỡ không gắn nhãn, tiếp tục được gắn nhãn và tiếp tục không gắn nhãn. Bây giờ, tôi sẽ nói về sự khác biệt giữa chúng.

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

Một tuyên bố phá vỡ không được gắn nhãn chấm dứt chuyển đổi trong cùng, cho, trong khi, tuyên bố 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.
        }
    }
}

Một dấu ngắt có nhãn chấm dứt một câu lệnh bên ngoài. Nếu bạn javac và java bản demo này, bạn sẽ nhận được:

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

Một câu lệnh tiếp tục không được gắn nhãn bỏ qua lần lặp hiện tại của câu lệnh 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
        }
    }
}

Một câu lệnh tiếp tục được gắn nhãn bỏ qua lần lặp hiện tại của một vòng lặp bên ngoài được đánh dấu bằng lable đã cho, nếu bạn javac và java bản demo, bạn sẽ nhận được:

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

nếu bạn có bất kỳ câu hỏi nào, bạn có thể xem hướng dẫn Java về điều này: nhập mô tả liên kết tại đây


0

Nói một cách đơn giản: break sẽ chấm dứt vòng lặp hiện tại và tiếp tục thực hiện tại dòng đầu tiên sau khi vòng lặp kết thúc. tiếp tục nhảy trở lại điều kiện vòng lặp và tiếp tục chạy vòng lặp.


Tại câu lệnh đầu tiên sau vòng lặp.
Hầu tước Lorne

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

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

Hãy thử mã này trong netbeans, bạn sẽ hiểu sự khác biệt giữa nghỉ và tiếp tục

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

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

0

Chương trình đơn giản để hiểu sự khác biệt giữa tiếp tục và phá vỡ

Khi continueđược sử dụng

    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

Khi breakđược sử dụng

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

Tiếp tục Tuyên bố dừng việc phát hành và bắt đầu tiếp theo

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

và Break Statment dừng vòng lặp hoặc Thoát khỏi vòng lặp


-1

Vì vậy, bạn đang ở trong một vòng lặp for hoặc while. Sử dụng nghỉ giải lao; sẽ đưa bạn ra ngoài vòng lặp. Như trong, nó sẽ kết thúc. Tiếp tục; sẽ bảo nó chạy lần lặp tiếp theo.

Không có điểm trong việc sử dụng tiếp tục trong câu lệnh if, nhưng phá vỡ; là hữu ích. Trong trường hợp chuyển đổi ... luôn luôn sử dụng break; để kết thúc một vụ án, vì vậy nó không thực hiện một vụ án khác.


1
"Không có điểm trong việc sử dụng tiếp tục trong câu lệnh if" - Vâng, nó có ý nghĩa. Ví dụ, khi một điều kiện được đáp ứng, bạn có thể bỏ qua một số phần xử lý trong bước lặp thực tế.
Sk8erPeter

Nó không chỉ là vô nghĩa nhưng bất hợp pháp, trừ trường hợp các ifbên trong một vòng lặp, trong trường hợp này có rất nhiều điểm.
Hầu tước Lorne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.