C # loop - break vs. devam


797

Bir C # (diğer diller için cevap vermekten çekinmeyin) döngüsünde, döngü ve döngü yapısını terk edip bir sonraki yinelemeye gitme aracı olarak devam etme arasındaki fark nedir?

Misal:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}

2
aşağıda doruk noktası ile blog yazısı adamthings.com/post/2012/07/26/…
Adam

8
continue;akımın işlenmesini durduracak ve koleksiyondan sonraki işleme rowdevam edecektir . Öte yandan, ifadeyi tamamen bırakacak ve kalan satırlar asla işlenmeyecektir. rowbreak;foreach
Jeppe Stig Nielsen

Yanıtlar:


1500

breakdöngüden tamamen continueçıkacak, sadece mevcut yinelemeyi atlayacaktır .

Örneğin:

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

    DoSomeThingWith(i);
}

Ara, döngü ilk yinelemede çıkmasına neden olur - DoSomeThingWithasla yürütülmez. Burada:

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

    DoSomeThingWith(i);
}

Yürütmüyor Will DoSomeThingWithiçin i = 0ancak döngü olacak devam ve DoSomeThingWithidam edilecektir i = 1için i = 9.


2
Etraflarında neden hiç diş teli yok - neden onlar olmadan çalıştığını biliyorum, ama neden?
George Willcox

52
@GeorgeWillcox Daha genç, daha aptal benliğim her zaman diş teli kullanmanın değerini öğrenmemişti. (Onlar tek ifadelerde C # isteğe bağlıdır, ancak koyarak değil onları daha kolay daha sonra bir hata tanıtmak yapar Ayrıca bkz. Programmers.stackexchange.com/a/16530/6342 )
Michael Stum

386

Bunu anlamanın gerçekten kolay bir yolu, anahtar kelimelerin her birine "loop" kelimesini yerleştirmektir. Terimler artık günlük ifadeler gibi okunuyorsa anlamlıdır.

break döngü - döngü bozulur ve durur.

continue loop - loop sonraki yinelemeyle yürütülmeye devam eder.


105

break , program sayacının en içteki döngü kapsamından atlamasına neden olur

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

Bunun gibi çalışır

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

Devam döngünün sonuna atlar. For döngüsünde, artış ifadesine atlamaya devam edin.

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

Bunun gibi çalışır

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

2
Burada birçok fordöngünün sadece standart döngüyü kullandığını fark ettim , ancak bu test öncesi ve sonrası whiledöngüler için işe yarar mı? gotoNotasyonu uçları beni çok inanıyorum, ancak bazı doğrulama ihtiyacı.
Daniel Park

1
@Daniel, WHILE döngüleri için BREAK ve CONTINUE kullanabilirsiniz, sorun değil.
Amila

@DanielPark Hem while("önceden test edilmiş") hem de do- while("sonradan test edildi") için, bir continue;ifade karşılandıktan sonra, bir sonraki yinelemenin ek bir yinelemenin yapıp yapmayacağına karar vermek için döngü koşulunun değerlendirilmesi gerekir. Tabii ki, break;döngü durumu kontrol edilmediğinde , döngü basitçe tamamen çıkar. Dolayısıyla gotobenzetme de bu yönü anlamak için iyidir.
Jeppe Stig Nielsen

37

Ara vermeli ya da devam etmeli olsam hep kafam karışırdı. Hatırlamama yardımcı olan şey bu:

Break vs devam ne zaman kullanılır?

  1. Break - ayrılmak gibi. Üzücü, siz ayrılıyorsunuz. Döngüden çıkılır.

mola

  1. Devam - bugün dinlenip yarın hepsini sıralayacağınız anlamına gelir (yani mevcut yinelemeyi atlayın)!

Devam et


Bunu eşimle paylaşacağım. Devam Edilebilir, GetOverIt olarak değiştirilmeli ve Break, MoveOnForward olarak yeniden adlandırılmalıdır. Geeks olarak adlandırılmamıza şaşmamalı, Break nasıl bir anlam ifade ediyor? Yıkıcı geliyor. Ve eklenmesi gereken - STOP veya daha iyi EndIt - birçok hatayı düzeltir ve C-sharp'u gerçekten keskinleştirir.
Mike

Tufan içine tekrar Aynı eski gezi o zamanlar geri oldu Bu yüzden büyük bir hata yaptım Bir kez yoluma
bakmaya

@TalalZahid anlamıyorum?
BKSpurgeon

28

breakforeachdöngüyü tamamen durduracak continue, bir sonrakine geçecekti DataRow.


20

Sevmeyen birkaç kişiden fazla var breakve continue. Onlarla ilgili en son şikayetim JavaScript: The Good Parts by Douglas Crockford. Ama bazen bunlardan birini kullanmanın, özellikle de dilinizde bir döngü do-whileveya do-untilstil içermiyorsa, işleri gerçekten basitleştirdiğini görüyorum .

breakBir şey için bir liste arayan döngülerde kullanma eğilimindeyim . Bir kez bulunduğunda, devam etmenin bir anlamı yoktur, bu yüzden bırakabilirsiniz.

continueBir listenin çoğu öğesiyle bir şey yaparken kullanıyorum , ancak yine de birkaçını atlamak istiyorum.

breakAçıklamada biri falan geçerli bir yanıt için kullanışlı zaman yoklama geliyor. Onun yerine:

Ask a question
While the answer is invalid:
    Ask the question

Bazı çoğaltmaları ortadan kaldırabilir ve kullanabilirsiniz:

While True:
    Ask a question
    If the answer is valid:
        break

Daha do-untilönce bahsettiğim döngü, bu sorun için daha zarif bir çözümdür:

Do:
    Ask a question
    Until the answer is valid

Çoğaltma yok ve breakgerek yok.


13

Hepsi çok iyi bir açıklama yaptı. Hala yardımcı olabilirse bir örnek vermek için cevabımı gönderiyorum.

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

İşte çıktı:

0 [Basılı] 1 [Basılı] 2 [Basılı]

Yani 3 = Basılı ve 4 [Basılı] görüntülenmez, çünkü i == 3

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

İşte çıktı:

0 [Basılı] 1 [Basılı] 2 [Basılı] 4 [Basılı]

İ == 3 olduğunda devam ettiğinden 3 [Basılı] görüntülenmeyecektir


7

mola

Break, bir döngüyü hemen çıkmaya zorlar.

Devam et

Bu kırılmanın tersini yapar. Döngüyü sonlandırmak yerine, hemen tekrar döngüye girer ve kodun geri kalanını atlar.


1
Devam etmek için döngü durumunu da kontrol eder :)
Grant

1
Continuezıt değildir break, breakdöngü durur, continuegeçerli yineleme durur.
Steven

6

Basit cevap:

Break hemen döngüden çıkar.
Devam , sonraki öğeyi işlemeye başlar. (Varsa, for / while öğesinin değerlendirme satırına atlayarak)


6

Örnek olarak

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

1, 2, 3 (ayrı satırlarda) yazdırır.

İ = 2'de kesme koşulu ekle

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

Şimdi döngü 1 yazdırır ve durur.

Arayı bir devam ile değiştirin.

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

Şimdi döngü 1 ve 3 baskı (atlama 2).

Böylece, breakdöngüyü durdurur continue, bir sonraki yinelemeye atlar.


5

Ruby maalesef biraz farklı. Not: Hafızam bu konuda biraz puslu, bu yüzden yanılıyorsam özür dilerim

break / devam yerine, döngülerde aynı şekilde davranan break / next komutuna sahiptir.

Döngüler (diğer her şey gibi) ifadelerdir ve yaptıkları son şeyi "geri döndürürler". Çoğu zaman, dönüş değerini bir döngüden almak anlamsızdır, bu yüzden herkes bunu yapar

a = 5
while a < 10
    a + 1
end

Ancak bunu yapabilirsiniz

a = 5
b = while a < 10
    a + 1
end # b is now 10

ANCAK, birçok yakut kodu bir blok kullanarak bir döngüyü 'öykünür'. Kanonik örnek

10.times do |x|
    puts x
end

İnsanların bir blok sonucu bir şeyler yapmak istemeleri daha yaygın olduğu için, burası dağınık hale gelir. break / next, bir blok bağlamında farklı şeyler ifade eder.

break, blok adı verilen koddan atlar

daha sonra bloktaki kodun geri kalanını atlar ve belirttiğinizi blok arayanına 'döndürür'. Bu örnekler olmadan bir anlam ifade etmiyor.

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

Yani evet. Ruby harika, ama bazı korkunç köşe vakaları var. Bu benim kullanma yıllarında gördüğüm en kötü ikinci :-)


5

Lütfen açık olanı belirtmeme izin verin: ne mola ne de devam etmenin programınıza devam edeceğini unutmayın; yani ben belirli bir hata için tuzak, sonra günlüğe sonra, işleme devam etmek istedim ve sonraki satır arasında daha fazla kod görevleri vardı, bu yüzden sadece üzerinden düşmesine izin.


3

Bir foreach döngü tamamen bozmak için, ara kullanılır;

Döngüdeki bir sonraki yinelemeye gitmek için devam kullanılır;

Break , bir Nesneler koleksiyonunda (Veri Tablosundaki Satırlar gibi) döngü yapıyorsanız ve belirli bir eşleşme arıyorsanız, bu eşleşmeyi bulduğunuzda, kalan satırlara devam etmenize gerek olmadığından, kırmak istiyorsanız dışarı.

Devam , bir döngü yinelemesinde ihtiyacınız olan şeyi başardığınızda yararlıdır. Normalde gerekecek devam sonrası eğer .


2

Eğer break kullanmak istemiyorsanız, yineleme koşulunu yanlış yapacak şekilde I değerini artırırsınız ve döngü bir sonraki yinelemede yürütülmez.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

0

Diğer dillere gelince:

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
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.