Menu

Break dan Continue di C: Cara Kerja dan Kapan Memakainya

break keluar dari loop atau switch; continue melompat ke putaran berikutnya. Cara keduanya bekerja di for, while, dan do-while, cara keluar dari nested loop dengan flag atau goto, dan penyalahgunaan yang membuat loop sulit diikuti.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Dua Cara Mengubah Alur Loop

Kondisi loop menentukan kapan loop berakhir, tetapi kadang jawaban sebenarnya muncul di tengah body. Kamu mencari sesuatu di array dan menemukannya di elemen ketiga, jadi buat apa memeriksa 997 elemen lainnya? Atau kamu memproses sebuah list dan satu entrinya kosong: lewati saja dan lanjutkan.

C punya satu kata kunci untuk masing-masing kasus:

  • break: keluar dari loop sekarang. Eksekusi berlanjut ke pernyataan pertama setelah loop.
  • continue: tinggalkan putaran ini saja. Lanjut ke putaran berikutnya.

Loop pertama mencetak 1 2 3 4 lalu berhenti. Loop kedua mencetak 1 2 3 4 6 7 8 9 10: ia melewati satu nilai dan terus berjalan.

break di Dalam Loop

Pemakaian yang paling umum adalah pencarian yang berhenti begitu berhasil:

Karena found diisi sebelum break, kode setelah loop bisa membedakan "ketemu" dan "elemennya habis". Pasangan itu, variabel hasil ditambah break, adalah pola pencarian standar di C. Counter loop-nya sendiri tidak bisa dipakai setelahnya kalau dideklarasikan di header, karena ia keluar dari scope di kurung kurawal penutup.

break selalu keluar dari satu loop saja: for, while, do-while, atau switch terdekat yang membungkusnya.

continue di Dalam Loop

continue dipakai untuk entri yang harus dilewati, bukan untuk menghentikan pekerjaan:

Ke mana continue melompat tergantung jenis loop-nya:

for        -> the update part of the header (so the counter still advances)
while      -> the condition test (nothing else in the body runs)
do-while   -> the condition test at the bottom

Perbedaan itu bukan sekadar teori. Di loop for, continue tidak akan pernah melewati penambahan counter, karena penambahannya ada di header. Di loop while, itu bisa terjadi:

/* BUG: continue skips i++, so this hangs at the first even number */
int i = 0;
while (i < 10) {
    if (i % 2 == 0) {
        continue;
    }
    printf("%d ", i);
    i++;
}

Pindahkan i++ ke atas continue, atau tulis sebagai loop for, di mana header-nya membuat kesalahan ini mustahil terjadi.

break di Dalam switch Bukan break untuk Loop

break mengakhiri loop atau switch terdekat yang membungkusnya, mana pun yang lebih dekat. Taruh switch di dalam loop, maka setiap break di dalamnya milik switch:

Perintah q mencetak pesannya dan loop terus berjalan sampai cc. Kalau keluar seharusnya mengakhiri loop, break itu tidak melakukannya. Perbaikannya adalah flag, goto, atau memindahkan loop ke sebuah fungsi dan memakai return. Semuanya ditunjukkan di bawah.

Keluar dari Nested Loop

Satu break hanya keluar satu tingkat. Di dalam dua loop bersarang, ia hanya mengakhiri loop dalam, dan loop luar memulai putaran berikutnya seolah tidak terjadi apa-apa.

C tidak punya break 2 dan tidak punya break berlabel. Ada tiga pilihan yang jujur:

Flag. Portabel, jelas, dan sedikit ramai:

Flag muncul di dua tempat, yaitu kondisi loop luar dan assignment-nya, dan itulah harganya. Dengan tiga tingkat nesting, ini jadi benar-benar tidak enak.

goto. Lompatan C yang sering dicela, dan inilah satu-satunya kasus di mana programmer C berpengalaman memakainya tanpa merasa bersalah:

goto maju ke label tepat setelah loop melakukan persis apa yang dilakukan break berlabel di bahasa lain, dalam satu baris dan tanpa flag yang harus dijaga agar tetap sinkron. Reputasi buruk goto berasal dari lompatan mundur dan lompatan ke tengah blok lain, yang memang menghasilkan alur kontrol yang sulit dibaca. Satu lompatan maju keluar dari nested loop tidak termasuk itu. Kernel Linux memakai pola yang sama untuk jalur cleanup. Gunakan dengan sengaja dan secukupnya; jangan biarkan tabu itu mendorongmu ke alternatif tiga flag yang lebih sulit dibaca.

Fungsi dan return. Biasanya jawaban terbaik, karena sebuah pencarian layak punya nama:

return keluar dari setiap loop di fungsi itu, tidak butuh flag maupun label, dan kode pencariannya sekarang punya nama dan bisa diuji tersendiri. Kalau nesting-nya sudah begitu dalam sampai keluar darinya jadi masalah, sering kali itu tanda bahwa blok tersebut memang sebaiknya menjadi fungsi.

Kapan Membantu, dan Kapan Merugikan

break dan continue berguna ketika keduanya membuat loop bisa bilang "kasus ini selesai" sekali saja, di dekat bagian atas, alih-alih membungkus seluruh body dengan if. Bandingkan:

/* with continue: the real work is not indented */
for (int i = 0; i < n; i++) {
    if (!isValid(a[i])) continue;
    if (isDuplicate(a[i])) continue;
    process(a[i]);
}

/* without: every guard adds a level */
for (int i = 0; i < n; i++) {
    if (isValid(a[i])) {
        if (!isDuplicate(a[i])) {
            process(a[i]);
        }
    }
}

Keduanya merugikan kalau jumlahnya banyak. Loop dengan lima break dan tiga continue yang tersebar punya kondisi keluar yang tidak tertulis di mana pun: pembaca harus mensimulasikan seluruh body untuk tahu kapan loop berhenti. Dua pedoman yang terbukti bagus: kumpulkan pengecekan continue di bagian atas body, dan kalau sebuah loop punya lebih dari satu atau dua break, pertimbangkan apakah kondisi di header seharusnya mengerjakan tugas itu.

Ada dua jebakan kecil. continue di do-while melompat ke pengecekan di bagian bawah, yang memang langkah berikutnya: tidak berbahaya, tetapi sering mengejutkan. Lalu break di luar loop atau switch adalah error kompilasi, satu-satunya kesalahan di sini yang ditangkap compiler untukmu.

Pertanyaan yang sering diajukan

Apa perbedaan break dan continue di C?

break mengakhiri loop sepenuhnya dan eksekusi berlanjut setelahnya. continue hanya meninggalkan putaran saat ini dan lanjut ke putaran berikutnya: ke bagian update pada loop for, atau langsung ke pengecekan kondisi pada while atau do-while.

Bagaimana cara keluar dari nested loop di C?

Satu break hanya keluar dari loop terdalam. Untuk keluar dari keduanya, pasang flag dan uji di kondisi loop luar, gunakan goto untuk melompat ke label setelah loop, atau, yang biasanya paling rapi, pindahkan loop ke sebuah fungsi lalu return.

Apakah break keluar dari loop atau hanya dari switch?

Dari mana pun yang paling dekat membungkusnya. break di dalam switch yang ada di dalam loop hanya mengakhiri switch; loop-nya tetap berjalan. Untuk keluar dari loop dari dalam switch, kamu butuh flag, goto, atau return.

Kenapa continue membuat while loop saya berjalan tanpa henti?

Karena continue melompat ke kondisi dan melewati sisa body, termasuk penambahan counter kalau letaknya di akhir. Di for loop bagian update ada di header sehingga selalu dijalankan; di loop while, pindahkan update sebelum continue atau gunakan for.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai