Break ve continue ifadesi arasındaki fark


266

Birisi breakve continueifadeleri arasındaki farkı söyleyebilir mi?

Yanıtlar:


531

breakbir döngü bırakır, bir continuesonraki yinelemeye atlar.


3
Java'nın aynı zamanda farklı anlambilime sahip etiketli devam etme / kesme ifadeleri içerdiğini unutmayın :-)
Jay

4
Bu sadece mola ve devam etmenin temelidir. Daha iyi bir açıklama için Jay's Post'a bakın
Xn0vv3r

1
Merak edenler için bir etiket kullanmak için etiket adını ve ardından bir döngüden önce ':' yazarsınız.
Caelum

"break" da bir anahtar ifadesini sonlandıracak
samsamara

1
her döngü için bir if deyiminde olsa bile bir sonraki yinelemeye atlamaya devam edecek mi?
klutch

102

Daha fazla ayrıntı ve kod örnekleri için Dallanma Bildirimleri'ne bakın :

break

Break deyiminin iki biçimi vardır: etiketli ve etiketsiz. Etiketlenmemiş formu, switch ifadesinin önceki tartışmasında gördünüz. Ayrıca, for, while veya do-while döngüsünü sonlandırmak için etiketlenmemiş bir mola kullanabilirsiniz [...]

Etiketlenmemiş bir kesme ifadesi en içteki anahtarı, while, do-while ifadesini sonlandırır, ancak etiketli bir break dış ifadeyi sonlandırır.

continue

Continue ifadesi, for, while veya do-while döngüsünün geçerli yinelemesini atlar. Etiketlenmemiş form, en içteki döngü gövdesinin sonuna atlar ve döngüyü denetleyen boole ifadesini değerlendirir. [...]

Etiketli bir devam ifadesi, verilen etiketle işaretlenmiş bir dış halkanın geçerli yinelemesini atlar.


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

Bu, aşağıdaki çıktıya yol açacaktır:

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

Bir bloğu, sadece for-loop'u değil, etiketleyebilir ve iç içe geçmiş bir bloktan dış bloğa kırıp devam edebilirsiniz. Bazı durumlarda bu yararlı olabilir, ancak programın mantığını anlamak için aşağıdaki örnekten daha iyi olması dışında, genel olarak bu tür kodlardan kaçınmaya çalışacaksınız:

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

Çünkü bu mümkün, kullanmanız gerektiği anlamına gelmiyor.

Kodunuzu komik bir şekilde gizlemek istiyorsanız, anlamlı bir ad seçmezsiniz, ancak http: ve kaynak kodundaki bir web adresi gibi yabancı görünen bir yorum ile takip edersiniz:

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

Sanırım bu bir Joshua Bloch sınavından. :)


1
Müstehcenlikle ilgili harika bir fikir, sadece http://stackoverflow.com/questions/462373/iş yapmakla kalmaz mıydı ?
Caelum

@ user2104648: evet, kesik bir 'n' yapıştırma hatası olmalıydı.
kullanıcı bilinmiyor

28

Break, döngüden tamamen ayrılır ve döngüden sonra ifadeleri yürütür. Devam, geçerli yinelemeden ayrılır ve döngüdeki bir sonraki değerle yürütülür.

Bu Kod Her Şeyi Açıklar:

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

Çıktı:

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

24

breakdöngüden tamamen çıkar. continuecontinue ifadesinden sonra ifadeleri atlar ve döngüyü sürdürür .


12

Break Bildirimi

Bazen , döngü tüm adım değerleri üzerinde tamamen yineleme yapmadan önce bir döngüden çıkmak gerekir . Örneğin, belirli bir koşulu karşılayan bir sayı bulana kadar bir sayı listesi üzerinde döngü. Veya belirli bir karakter okunana kadar dosyadaki bir karakter akışı üzerinden döngü yapmak.

Aşağıdaki örnekte, 0 ile 9 arasındaki değerleri yazdırmak için basit bir döngü kullanıyoruz:

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

Çıktı:

0
1
2
3
4
5
6
7
8
9

Şimdi i == 4 olduğunda bir break ifadesi eklersek, i 4'e eşit olduğunda kodumuz döngüden kopar. Döngüler ve do-while döngüleri için döngülerden çıkmak için break deyimini kullanabilirsiniz. Break ifadesi yalnızca geçerli döngüden çıkar. Bir iç döngüden iç içe bir iç döngüden kopmak için, break deyimine sahip etiketler kullanmanız gerekir.

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

Çıktı:

0
1
2
3
4

Bildirime Devam Et

Java'nın devam ifadesi bir döngünün geçerli yinelemesini atlar ve doğrudan bir sonraki yinelemeye gider. For deyiminde continue ifadesini çağırdıktan sonra, döngü yürütme adım değerini yürütecek ve sonraki yinelemeye geçmeden önce boole koşulunu değerlendirecektir. Aşağıdaki örnekte, 0 ile 9 arasındaki tüm değerleri bir döngüde yazdırıyoruz, ancak 4'ü yazdırmayı atlıyoruz.

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

Çıktı:

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

Döngü Etiketi - Kesme Deyimi İç döngüden çıktıktan sonra yürütmenin nerede devam etmesini istediğinizi belirterek iç içe döngüler içindeki etiketleri kullanabilirsiniz . Normalde, break deyimi yalnızca en içteki döngüden ayrılır, bu nedenle bir dış döngüden çıkmak istediğinizde, bunu gerçekleştirmek için etiketleri kullanabilirsiniz, temel olarak bir goto deyimine benzer bir şey yapabilirsiniz.

Aşağıdaki örnek, hepsi birbirinin içine yerleştirilmiş 3 döngü kullanır. En içteki döngünün içinden en dıştaki döngüden tamamen çıkmanın bir yolu olmadığından, bunu gerçekleştirmek ve break deyiminin yanındaki etiketi belirtmek için “dış1” etiketini kullanabiliriz.

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

Çıktı:

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

Görüntülenen son satırın nasıl " 0 [0]" olduğuna dikkat edin , burada j == 3 ve "break external1;" en dıştaki döngüden kurtulmak için.

Döngü Etiketleri - Bildirime Devam Et

Belirli bir noktadan döngü yapmaya devam etmek için sürekli anahtar kelimeyle birlikte etiketleri de kullanabilirsiniz. Önceki örneği almak ve continue outer1;bunun yerine yalnızca bir satırı belirtmek break outer1;, döngünün döngüden çıkmak outer1yerine etiketten dönmeye devam etmesine neden olur . Her seferinde nasıl continue outer1;çağrıldığına dikkat edin, kod döngü i dizinini 1 arttırdıktan sonra dış döngüden devam eder.

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]

Kaynak: Java'daki Döngüler - Ultimate Guide


7

Mükemmel cevap basit ve doğru.

Bir kod örneği eklerdim.

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

Bir breako uygulandığı ifadenin sonlandırılmasına ifadesi sonuçları ( switch, for, do, veya while).

Bir continuedeyim akım döngüsü yineleme sonlandırmak ve döngü açıklamaya kontrolünü döndürmek için kullanılır.


5

continueyürütme akımı atlar döngü ve taşınır sonraki döngü halbuki break HAREKETLER OUT bir döngü ve bir sonraki deyimi yürütür sonra döngü. Aşağıdaki kodu kullanarak farkı öğrendim. Farklı çıkışlara göz atın.

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

Aşağıdakileri göz önünde bulundur:

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

break , döngünün sona ermesine neden olur ve n değeri 0'dır.

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

devam , program sayacının döngünün ilk satırına dönmesine neden olur (koşul kontrol edilir ve n değeri artar) ve n'nin son değeri 10'dur.

Ayrıca kırılmanın sadece içinde bulunduğu döngünün yürütülmesini sonlandırdığına dikkat edilmelidir :

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

Etkisi bir şey çıktı olacak

0
0
0
0
0
5

1
Örneklerinizde değişken kapsam belirleme sorunlarınız var.
Darron

3

breakDöngünün dışında beyanı sonları, (yürütülecek bir sonraki deyimi Kapanış ayracı sonra ilk biridir) iken continuebaşlar sonraki tekrarda üzerinde döngü.


2

breakDeyim geçerli döngü kontrol yapısını varsa ve bunun arkasında atlar ise continueçıkışlar çok ama döngü durumuna atlama geri.


2

Basit Örnek:

break döngü bırakır.

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

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

continue başlangıç ​​döngüsüne geri döner.

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

Bir koşulun yerine getirilmesi durumunda herhangi bir şeyin yürütülmesini önlemek için, devam etmeyi ve bir koşul yerine getirilirse döngüden çıkmayı sağlamak için mola kullanılmalıdır.

Örneğin, aşağıda belirtilen kodda.

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

        if(i==3){

           continue;

        }
       System.out.println(i);
     }

Yukarıdaki kod sonucu yazdıracaktır: 0 1 2 4

HAYIR bu kodu göz önünde bulundurun

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


            if(i==3){

                break;

            }
            System.out.println(i);
         }

Bu kod yazdırılacaktır 0 1 2

Devam ve kopmada temel fark budur.


1

işte ara semantiği:

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

İşte devam semantiği:

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 # molası yok; Ve devam et; ifadeleri? İnanamıyorum.
OscarRyz

Evet C # var, ben sadece ara semanti açıklamak ve devam :-)
Michael Buen

1
Hiçbir şeyi açıklamıyorsunuz, sadece bir kod yayınladınız. Yorumlanmış kod bile yok. Bir kod parçası bir açıklama veya 'anlamsal' değildir.
Lorne Marquis

1

İlk olarak, Java'da mola, etiketsiz mola, etiketli devam ve etiketsiz devam eden iki tür kırılma ve devam etmeyi bilmeniz gerektiğini düşünüyorum.Şimdi aralarındaki fark hakkında konuşacağım.

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

Etiketlenmemiş bir kesme ifadesi, do-while ifadesi için en içteki anahtarı sonlandırır.

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

Etiketli bir mola dış ifadeyi sonlandırır. Eğer bu demosu javac ve java yaparsanız, şunları elde edersiniz:

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

Etiketlenmemiş bir devam ifadesi, for, while, do-while ifadesinin geçerli yinelemesini atlar.

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

Etiketli bir devam ifadesi, verilen etikel ile işaretlenmiş bir dış döngünün geçerli yinelemesini atlar, eğer javac ve java demosu yaparsanız, şunları elde edersiniz:

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

Herhangi bir sorunuz varsa, bunun Java eğitimini görebilirsiniz: bağlantı açıklamasını buraya girin


0

Basitçe söylemek gerekirse: break geçerli döngüyü sonlandıracak ve döngü bittikten sonra ilk satırda yürütmeye devam edecektir. Continue, döngü durumuna geri atlar ve döngüyü çalıştırmaya devam eder.


Döngüden sonraki ilk ifadede .
Lorne Marquis

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

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

netbeans bu kodu deneyin break ve devam arasındaki farkı anlayacaksınız

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

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

0

Continue ve break arasındaki farkı anlamak için basit bir program

Ne zaman continuekullanılır

    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

Ne zaman breakkullanılır

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

Devam İfadeyi yinelemeyi durdurun ve sonraki yinelemeyi başlatın Örn:

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

ve Break Deyimi döngüyü durdurur veya döngüden çıkar


-1

böylece for veya while döngüsünün içindesiniz. Mola kullanma; sizi döngünün dışına çıkaracaktır. Olduğu gibi bitecek. Devam et; bir sonraki yinelemeyi çalıştırmasını söyleyecektir.

İf deyiminde devam etmenin bir anlamı yoktur, ancak break; kullanışlı. Anahtar ... durumda, her zaman ara kullanın; bir vakayı sonlandırmak için başka bir vakayı yürütmez.


1
"If deyiminde kullanmanın anlamı yok" - Evet, mantıklı. Örneğin, bir koşul karşılandığında, gerçek yineleme adımında bazı işleme parçalarını atlayabilirsiniz.
Sk8erPeter

Bu, anlamsız ama yasadışı değil sadece süreceif noktanın bol bu durumda bir döngü içinde olduğunu.
Lorne Marquis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.