C # loop - break vs continue

797

Dalam loop C # (jangan ragu untuk menjawab untuk bahasa lain), apa perbedaan antara break dan continue sebagai sarana untuk meninggalkan struktur loop, dan pergi ke iterasi berikutnya?

Contoh:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
Seibar
sumber
2
posting blog dengan kulminasi di bawah adamthings.com/post/2012/07/26/…
Adam
8
continue;akan berhenti memproses arus rowdan melanjutkan yang berikutnya row dari koleksi. Di sisi lain, break;akan meninggalkan foreachpernyataan sepenuhnya dan baris yang tersisa tidak akan pernah diproses.
Jeppe Stig Nielsen

Jawaban:

1500

breakakan keluar dari loop sepenuhnya, continuehanya akan melewatkan iterasi saat ini.

Sebagai contoh:

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

    DoSomeThingWith(i);
}

Terobosan akan menyebabkan loop keluar pada iterasi pertama - DoSomeThingWithtidak akan pernah dieksekusi. Ini di sini:

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

    DoSomeThingWith(i);
}

Tidak akan mengeksekusi DoSomeThingWithuntuk i = 0, tetapi loop akan berlanjut dan DoSomeThingWithakan dieksekusi untuk i = 1ke i = 9.

Michael Stum
sumber
2
Mengapa tidak ada kawat gigi mereka di sekitar terus - saya tahu itu bekerja tanpa mereka, tetapi mengapa?
George Willcox
52
@ GeorgeWillcox Saya yang lebih muda, lebih bodoh belum belajar nilai menggunakan kawat gigi, selalu. (Mereka opsional dalam C # untuk pernyataan tunggal, tetapi tidak menempatkannya membuatnya lebih mudah untuk memperkenalkan bug di kemudian hari. Juga lihat programmers.stackexchange.com/a/16530/6342 )
Michael Stum
386

Cara yang sangat mudah untuk memahami ini adalah dengan menempatkan kata "loop" setelah setiap kata kunci. Istilah sekarang masuk akal jika hanya dibaca seperti frasa sehari-hari.

break loop - looping rusak dan berhenti.

continue loop - loop terus dijalankan dengan iterasi berikutnya.

JeremiahClark
sumber
105

break menyebabkan penghitung program melompat keluar dari ruang lingkup loop terdalam

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

Bekerja seperti ini

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

terus melompat ke ujung lingkaran. Dalam for for loop, lanjutkan melompat ke ekspresi kenaikan.

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

    printf("%d", i);
}

Bekerja seperti ini

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

    printf("%d", i);

    CONTINUE:;
}
Titik koma
sumber
2
Saya perhatikan bahwa banyak loop di sini hanya menggunakan forloop standar , tetapi apakah ini akan berfungsi untuk whileloop pra dan pasca diuji ? The gotonotasi mengarah saya untuk percaya begitu, tapi perlu beberapa verifikasi.
Daniel Park
1
@Aniel, untuk loop SAAT Anda dapat menggunakan BREAK dan LANJUTKAN, tidak ada masalah.
Amila
@DanielPark Untuk keduanya while("pra-diuji") dan do- while("pasca-diuji"), setelah sebuah continue;pernyataan terpenuhi, hal berikutnya yang akan terjadi adalah bahwa kondisi loop dievaluasi untuk memutuskan apakah pengulangan tambahan harus dilakukan. Tentu saja, dengan break;kondisi loop tidak dicentang, loop hanya keluar sepenuhnya. Jadi gotoanaloginya bagus untuk memahami aspek ini juga.
Jeppe Stig Nielsen
37

Saya dulu selalu bingung apakah saya harus menggunakan istirahat, atau melanjutkan. Inilah yang membantu saya mengingat:

Kapan menggunakan break vs continue?

  1. Break - ini seperti putus. Menyedihkan, kalian berpisah. Loop keluar.

Istirahat

  1. Lanjutkan - berarti Anda akan memberi istirahat hari ini dan menyelesaikan semuanya besok (yaitu lewati iterasi saat ini)!

Terus

BKSpurgeon
sumber
Akan membagikan ini dengan mitra saya. Mungkin Lanjutkan harus diubah namanya menjadi GetOverIt, dan Break harus diganti namanya menjadi MoveOnForward. Tidak heran kita disebut Geeks, bagaimana cara Break masuk akal? Kedengarannya destruktif. Dan satu yang perlu ditambahkan adalah - BERHENTI, atau EndIt yang lebih baik - akan memperbaiki banyak bug, dan membuat C-tajam benar-benar tajam.
Mike
Menuju banjir lagi Perjalanan lama yang sama saat itu kembali Jadi saya membuat kesalahan besar Cobalah melihatnya sekali jalan
Talal Zahid
@ TalalZahid saya tidak mengerti?
BKSpurgeon
28

breakakan menghentikan foreachloop sepenuhnya, continueakan melompat ke yang berikutnya DataRow.

palmsey
sumber
20

Ada lebih dari beberapa orang yang tidak suka breakdan continue. Keluhan terakhir yang saya lihat tentang mereka adalah dalam JavaScript: The Good Parts oleh Douglas Crockford. Tetapi saya menemukan bahwa kadang-kadang menggunakan salah satu dari mereka benar-benar menyederhanakan hal-hal, terutama jika bahasa Anda tidak termasuk do-whileatau do-untilgaya loop.

Saya cenderung menggunakan breakloop yang mencari daftar untuk sesuatu. Setelah ditemukan, tidak ada gunanya melanjutkan, jadi sebaiknya Anda berhenti.

Saya menggunakan continueketika melakukan sesuatu dengan sebagian besar elemen daftar, tetapi masih ingin melewatkan beberapa.

The breakPernyataan juga datang ketika pemungutan suara berguna untuk respon yang valid dari seseorang atau sesuatu. Dari pada:

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

Anda dapat menghilangkan duplikasi dan menggunakan:

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

The do-untilloop yang saya sebutkan sebelumnya adalah solusi yang lebih elegan untuk itu masalah tertentu:

Do:
    Ask a question
    Until the answer is valid

Tidak ada duplikasi, dan tidak breakdiperlukan juga.

Yukondude
sumber
13

Semua telah memberikan penjelasan yang sangat bagus. Saya masih memposting jawaban saya hanya untuk memberi contoh jika itu bisa membantu.

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

Berikut hasilnya:

0 [Dicetak] 1 [Dicetak] 2 [Dicetak]

Jadi 3 [Dicetak] & 4 [Dicetak] tidak akan ditampilkan karena ada jeda ketika saya == 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] ";
}

Berikut hasilnya:

0 [Dicetak] 1 [Dicetak] 2 [Dicetak] 4 [Dicetak]

Jadi 3 [Dicetak] tidak akan ditampilkan karena ada melanjutkan ketika saya == 3

Pritom Nandy
sumber
7

Istirahat

Break memaksa sebuah loop untuk segera keluar.

Terus

Ini kebalikan dari istirahat. Alih-alih mengakhiri loop, itu segera loop lagi, melewatkan sisa kode.

Sona
sumber
1
Lanjutkan memeriksa kondisi loop juga :)
Grantly
1
Continuebukan kebalikan dari break, breakmenghentikan loop, continuemenghentikan iterasi saat ini.
Steven
6

Jawaban sederhana:

Break segera keluar dari loop.
Lanjutkan mulai memproses item berikutnya. (Jika ada, dengan melompat ke garis evaluasi untuk sementara)

Maltrap
sumber
6

Contohnya

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

Mencetak 1, 2, 3 (pada baris terpisah).

Tambahkan kondisi istirahat di i = 2

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

    Console.WriteLine(i);
}

Sekarang loop mencetak 1 dan berhenti.

Ganti istirahat dengan melanjutkan.

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

    Console.WriteLine(i);
}

Sekarang untuk mengulang cetakan 1 dan 3 (melewatkan 2).

Dengan demikian, breakhentikan loop, sedangkan continuemelompat ke iterasi berikutnya.

Kolonel Panic
sumber
5

Sayangnya Ruby agak berbeda. PS: Ingatan saya agak kabur tentang ini jadi minta maaf jika saya salah

bukannya break / continue, itu telah break / next, yang berperilaku sama dalam hal loop

Loop (seperti yang lainnya) adalah ekspresi, dan "mengembalikan" hal terakhir yang mereka lakukan. Sebagian besar waktu, mendapatkan nilai kembali dari loop tidak ada gunanya, jadi semua orang hanya melakukan ini

a = 5
while a < 10
    a + 1
end

Namun Anda dapat melakukan ini

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

NAMUN, banyak kode ruby ​​'mengemulasi' sebuah loop dengan menggunakan blok. Contoh kanonik adalah

10.times do |x|
    puts x
end

Karena jauh lebih umum bagi orang-orang untuk ingin melakukan sesuatu dengan hasil dari blok, ini adalah tempat itu menjadi berantakan. break / next berarti hal-hal yang berbeda dalam konteks blok.

break akan keluar dari kode yang disebut blok

selanjutnya akan melewati sisa kode di blok, dan 'mengembalikan' apa yang Anda tentukan ke penelepon blok. Ini tidak masuk akal tanpa contoh.

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.

Jadi ya. Ruby luar biasa, tetapi memiliki beberapa kasus sudut yang mengerikan. Ini adalah yang terburuk kedua yang pernah saya lihat selama bertahun-tahun menggunakannya :-)

Orion Edwards
sumber
5

Tolong izinkan saya menyatakan yang jelas: perhatikan bahwa menambahkan tidak ada istirahat atau melanjutkan, akan melanjutkan program Anda; yaitu saya terjebak untuk kesalahan tertentu, kemudian setelah login, saya ingin melanjutkan pemrosesan, dan ada lebih banyak tugas kode di antara baris berikutnya, jadi saya biarkan saja gagal.

David Hall
sumber
3

Untuk benar-benar keluar dari loop foreach, break digunakan;

Untuk pergi ke iterasi berikutnya dalam loop, lanjutkan digunakan;

Istirahat berguna jika Anda mengulang-ulang koleksi Objek (seperti Baris dalam Datatable) dan Anda sedang mencari kecocokan tertentu, ketika Anda menemukan kecocokan itu, tidak perlu melanjutkan melalui baris yang tersisa, jadi Anda ingin memecahkan di luar.

Lanjutkan berguna ketika Anda telah mencapai apa yang Anda butuhkan di samping iterasi loop. Anda biasanya akan melanjutkan setelah if .

Gopesh Sharma
sumber
2

jika Anda tidak ingin menggunakan break, Anda hanya meningkatkan nilai I sedemikian rupa sehingga membuat kondisi iterasi salah dan loop tidak akan dieksekusi pada iterasi berikutnya.

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
}
Umair Khalid
sumber
0

Adapun bahasa lain:

'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
dba
sumber