Pernyataan lompat (jump statement) mengalihkan eksekusi ke titik lain tanpa mengikuti urutan pernyataan yang biasa. Bahasa C menyediakan tiga pernyataan lompat, yaitu break, continue, dan goto. Topik ini membahas perilaku masing-masing, pola pemakaiannya di dalam perulangan, serta alasan goto umumnya dihindari dalam kode modern.
Pernyataan break#
Pernyataan break mengakhiri perulangan terdekat yang melingkupinya, lalu melanjutkan eksekusi pada pernyataan sesudah perulangan tersebut. Kata terdekat berarti break di dalam perulangan bagian dalam tidak menghentikan perulangan luarnya. Pernyataan ini juga dipakai untuk keluar dari switch, sehingga perannya di dalam switch berbeda dari perannya di dalam perulangan. Karena tujuannya keluar ketika kondisi tertentu terpenuhi, break hampir selalu ditulis di dalam if.
Program berikut mencari pembagi terkecil dari bilangan 91. Tanpa break, perulangan tetap memeriksa semua kandidat sampai kandidat mencapai n, padahal jawabannya sudah ditemukan lebih awal.
#include <stdio.h>
int main(void) {
int n = 91;
int pembagi = 0;
for (int kandidat = 2; kandidat <= n; kandidat = kandidat + 1) {
if (n % kandidat == 0) {
pembagi = kandidat;
break;
}
}
if (pembagi == 0) {
printf("%d adalah bilangan prima\n", n);
} else {
printf("Pembagi terkecil %d adalah %d\n", n, pembagi);
}
return 0;
}Pembagi terkecil 91 adalah 7Perulangan berhenti pada kandidat bernilai 7 karena 91 habis dibagi 7, dan kandidat 8 sampai 91 tidak pernah diuji. Nilai pembagi tetap 0 apabila tidak ada kandidat yang membagi habis, keadaan yang menandai bilangan prima. Pola mencari lalu keluar lebih awal seperti ini adalah contoh pemakaian break yang lazim. Perulangan yang keluar lebih awal juga menghemat pekerjaan karena sisa iterasi yang sudah tidak berguna tidak dijalankan.
Pernyataan continue#
Pernyataan continue melewati sisa tubuh perulangan pada putaran yang sedang berjalan, lalu kembali ke pengujian kondisi. Pada for, pembaruan penghitung tetap dijalankan sebelum kondisi diuji ulang, sedangkan pada while dan do-while kondisi langsung diuji. Berbeda dengan break yang keluar dari perulangan, continue hanya melompati satu iterasi.
Diagram berikut membandingkan titik lompatan keduanya pada sebuah perulangan.
Program berikut menjumlahkan bilangan 1 sampai 20 dengan melewatkan kelipatan 3. Pernyataan continue membuat putaran untuk 3, 6, 9, dan seterusnya langsung berpindah ke pembaruan i tanpa menjumlahkan.
#include <stdio.h>
int main(void) {
int jumlah = 0;
for (int i = 1; i <= 20; i = i + 1) {
if (i % 3 == 0) {
continue; /* kelipatan 3 tidak dijumlahkan */
}
jumlah = jumlah + i;
}
printf("Jumlah 1-20 tanpa kelipatan 3 = %d\n", jumlah);
return 0;
}Jumlah 1-20 tanpa kelipatan 3 = 147Tanpa continue, logika yang sama ditulis sebagai if (i % 3 != 0) { jumlah = jumlah + i; }, dan keduanya sama-sama sah. continue lebih tepat apabila sisa tubuh perulangan panjang karena tidak seluruh tubuh perlu dibungkus kondisi. Pada while, waspadai pembaruan yang diletakkan sesudah continue, karena pembaruan itu ikut terlewat dan perulangan bisa berjalan tak terbatas.
Pernyataan goto dan labelnya#
Pernyataan goto melompat langsung ke pernyataan yang diberi label di dalam fungsi yang sama. Bentuknya goto nama_label;, dan label ditulis sebagai nama_label:. Lompatan boleh mengarah ke depan maupun ke belakang, sehingga aliran program tidak lagi mengikuti struktur blok. Kemampuan inilah yang membuat goto berisiko apabila dipakai bebas, karena jejak eksekusinya sulit diikuti dan keadaan variabel pada titik lompatan mudah salah dibaca. Sebagian standar penulisan kode melarang goto kecuali untuk beberapa pola tertentu.
Salah satu pola yang masih diterima adalah keluar dari perulangan bersarang. Pernyataan break hanya mengakhiri perulangan terdekat, sehingga keluar dari dua tingkat sekaligus membutuhkan goto atau variabel penanda. Program berikut menghentikan dua perulangan sekaligus begitu pasangan yang dicari ditemukan.
#include <stdio.h>
int main(void) {
int a, b;
for (a = 1; a <= 10; a = a + 1) {
for (b = 1; b <= 10; b = b + 1) {
if (a * b == 24) {
printf("Pasangan ditemukan: %d x %d = 24\n", a, b);
goto selesai;
}
}
}
printf("Tidak ada pasangan yang cocok\n");
selesai:
return 0;
}Pasangan ditemukan: 3 x 8 = 24Tanpa goto, pola yang sama ditulis dengan variabel penanda dan kondisi tambahan pada kedua kepala perulangan.
// tidak-dijalankan
int ditemukan = 0;
for (a = 1; a <= 10 && ditemukan == 0; a = a + 1) {
for (b = 1; b <= 10; b = b + 1) {
if (a * b == 24) {
ditemukan = 1;
break;
}
}
}Kedua versi menghasilkan keluaran yang sama, dan banyak standar kode memilih versi kedua karena alurnya tetap mengikuti struktur perulangan. Adapun pada fungsi yang panjang dengan banyak langkah pembersihan, sebagian penulis C justru memakai goto. Lompatan itu selalu mengarah ke depan menuju satu label pembersihan, pola yang tampak pada kode kernel sistem operasi. Kriteria yang dapat dipegang: lompatan hanya mengarah ke depan, menuju label di akhir fungsi, dan tidak melompati inisialisasi variabel yang dipakai sesudahnya.
Perbandingan break, continue, dan goto#
Ketiga pernyataan tersebut sama-sama mengubah arah eksekusi, tetapi jangkauan lompatannya berbeda. Perbedaan itu menentukan seberapa besar risiko setiap pernyataan bagi keterbacaan. Tabel berikut meringkas ketiganya.
| Pernyataan | Lompatan yang dilakukan | Pemakaian yang lazim |
|---|---|---|
break | Keluar dari perulangan atau switch terdekat | Menghentikan pencarian saat jawaban ditemukan |
continue | Ke pengujian kondisi, dengan pembaruan for tetap dijalankan | Melewati data yang tidak perlu diproses |
goto | Ke label mana pun di dalam fungsi yang sama | Keluar perulangan bersarang dan pola pembersihan |
Urutan pertimbangannya dapat diringkas sebagai berikut. Selesaikan pengendalian aliran dengan struktur percabangan dan perulangan terlebih dahulu, gunakan break dan continue untuk memangkas iterasi yang tidak diperlukan, dan simpan goto untuk kasus yang memang tidak tertangani oleh keduanya. break dan continue terikat pada perulangan tempatnya berada, sehingga pembaca kode selalu dapat menentukan titik tujuannya tanpa mencari.
Sebaliknya, goto membutuhkan pencarian labelnya, dan itulah biaya keterbacaan yang dibayar setiap kali goto dipakai. Lompatan goto yang masuk ke tengah blok juga dapat melewati inisialisasi variabel, sehingga variabel terpakai dalam keadaan belum diisi. Jenis kesalahan semacam ini tidak muncul pada break dan continue karena keduanya tidak dapat masuk ke blok dari luar.
Ringkasan#
breakkeluar dari perulangan atauswitchterdekat, sedangkancontinuemelompati sisa tubuh satu iterasi.- Pada
for, pembaruan penghitung tetap dijalankan setelahcontinue. gotomelompat ke label mana pun di dalam fungsi dan umumnya dihindari karena merusak keterbacaan.- Pemakaian
gotoyang masih diterima terbatas pada keluar perulangan bersarang dan pola pembersihan yang melompat ke depan.
Referensi#
- break statement — Cppreference — Kaidah break pada perulangan dan switch dalam standar C.
- continue statement — Cppreference — Kaidah continue beserta perbedaan perilakunya pada for dan while.
- goto statement — Cppreference — Kaidah label dan batasan lompatan goto dalam standar C.