Kadang kita ingin loop berhenti sebelum kondisi alaminya terpenuhi. Misalnya saat mencari sebuah nilai di dalam array dan menemukannya di tengah, tidak ada gunanya melanjutkan iterasi sampai akhir—kita ingin segera keluar dari loop begitu nilai ditemukan. Demikian juga saat mengakumulasi nilai yang melampaui batas, kita ingin loop berhenti segera setelah batas terlampaui. Statement break menyediakan mekanisme keluar dari loop lebih awal. Pada chapter ini kita akan menelaah sintaks break, perilakunya di berbagai jenis loop, serta keterbatasannya dalam nested loops.
Sintaks Dasar break #
Statement break adalah keyword tunggal yang ditulis tanpa argumen:
break;Saat break dieksekusi di dalam body loop, kontrol segera keluar dari loop terdalam yang melingkupinya. Loop di atasnya (jika ada) tetap berjalan normal. Setelah break, eksekusi melompat ke statement pertama setelah tanda kurung kurawal tutup loop tersebut. Berdasarkan ISO/IEC 9899 §6.8.6.3, break hanya berlaku untuk loop for, while, do-while, dan statement switch—tidak berlaku untuk if atau blok kode biasa.
Visualisasi Konsep #
Diagram berikut memperlihatkan bagaimana break memintas alur normal loop dan keluar lebih awal:
Pada diagram di atas, alur normal loop adalah kondisi → body → sisa body → kondisi (kembali ke atas). Saat break dipanggil di dalam body, kontrol segera melompat ke statement setelah loop—sisa body setelah break tidak dieksekusi, dan kondisi tidak dievaluasi ulang. Inilah sebabnya break cocok untuk pola early exit seperti pencarian linier: setelah elemen yang dicari ditemukan, break menghentikan iterasi sehingga loop tidak perlu memproses elemen yang tersisa. break hanya keluar dari loop terdalam—loop luar pada nested loop tetap berjalan normal.
Mencari Nilai di dalam Array #
Pola paling umum pemakaian break adalah pencarian linier: kita mengiterasi array, dan begitu nilai yang dicari ditemukan, kita keluar dari loop. Tanpa break, kita harus memakai flag tambahan atau kondisi yang lebih rumit:
#include <stdio.h>
int main(void) {
int data[] = {3, 7, 2, 8, 5, 9, 4, 6};
int n = sizeof(data) / sizeof(data[0]);
int indeks_ditemukan = -1;
/* Cari angka 5 pertama */
for (int i = 0; i < n; i = i + 1) {
if (data[i] == 5) {
indeks_ditemukan = i;
break;
}
}
if (indeks_ditemukan >= 0) {
printf("Angka 5 ditemukan di indeks %d\n", indeks_ditemukan);
} else {
printf("Angka 5 tidak ditemukan\n");
}
return 0;
}Output yang Dihasilkan:
Angka 5 ditemukan di indeks 4Mari kita telaah baris-baris kode di atas:
- Baris 5 (
int data[] = {3, 7, 2, 8, 5, 9, 4, 6};): array berisi 8 angka acak yang akan dicari. - Baris 6 (
int n = sizeof(data) / sizeof(data[0]);): menghitung jumlah elemen array secara otomatis. Jika array diubah,nikut menyesuaikan tanpa kita perlu mengedit manual. - Baris 7 (
int indeks_ditemukan = -1;): variabel penampung hasil pencarian, diisi-1sebagai nilai sentinel yang berarti “belum ditemukan”. - Baris 10 (
for (int i = 0; i < n; i = i + 1)): loop mengiterasi array dari indeks0sampain-1. - Baris 11 (
if (data[i] == 5)): membandingkan elemen array saat ini dengan nilai yang dicari. - Baris 12 (
indeks_ditemukan = i;): menyimpan indeks saat elemen cocok ditemukan. - Baris 13 (
break;): keluar dari loop. Tanpabreak, loop akan terus berjalan sampai akhir meskipun nilai sudah ditemukan, memboroskan waktu eksekusi.
break di dalam while #
Statement break juga bekerja di dalam while dan do-while. Kombinasi while (1) dengan break adalah idiom loop tanpa akhir yang sering dipakai ketika kondisi berhenti rumit atau bergantung pada banyak variabel:
#include <stdio.h>
int main(void) {
int total = 0;
int i = 1;
while (1) {
total = total + i;
if (total > 100) {
printf("Berhenti: total = %d (di i = %d)\n", total, i);
break;
}
i = i + 1;
}
return 0;
}Output yang Dihasilkan:
Berhenti: total = 105 (di i = 14)Pada contoh di atas, loop while (1) akan berjalan tanpa henti jika tidak ada break. Setelah setiap penambahan ke total, kondisi total > 100 dievaluasi. Begitu total melewati 100 (yaitu 105 pada i = 14), break dieksekusi dan program keluar dari loop. Pola ini bermanfaat ketika kondisi berhenti tidak dapat ditulis ringkas dalam satu ekspresi while.
break Hanya Keluar dari Loop Terdalam #
Salah satu jebakan klasik break adalah perilakunya dalam nested loops. break hanya menghentikan loop terdalam yang melingkupinya—loop di luar tetap berjalan. Banyak pemula berasumsi break menghentikan seluruh nested loops, yang menyebabkan bug yang sulit dilacak:
#include <stdio.h>
int main(void) {
/* break hanya menghentikan inner loop, bukan outer loop */
for (int baris = 1; baris <= 3; baris = baris + 1) {
for (int kolom = 1; kolom <= 5; kolom = kolom + 1) {
if (kolom == 3) {
break;
}
printf("baris=%d kolom=%d | ", baris, kolom);
}
printf("(lanjut ke baris berikutnya)\n");
}
return 0;
}Output yang Dihasilkan:
baris=1 kolom=1 | baris=1 kolom=2 | (lanjut ke baris berikutnya)
baris=2 kolom=1 | baris=2 kolom=2 | (lanjut ke baris berikutnya)
baris=3 kolom=1 | baris=3 kolom=2 | (lanjut ke baris berikutnya)Pada contoh di atas, break hanya menghentikan inner loop kolom saat kolom == 3. Outer loop baris tetap berjalan normal sampai baris mencapai 3. Hasilnya, setiap baris mencetak dua kolom (kolom = 1 dan kolom = 2) sebelum break keluar dari inner loop.
break di dalam switch #
Selain loop, break juga dipakai di dalam switch untuk mencegah fallthrough ke case berikutnya. Bab tentang break dan fallthrough di section percabangan telah membahas penggunaan ini secara rinci. Perbedaan perilaku break di loop dan switch adalah: di switch, break menghentikan eksekusi case; di loop, break menghentikan iterasi loop. Meskipun keyword-nya sama, konteks pemakaian berbeda dan keduanya tidak saling memengaruhi.