Pada chapter sebelumnya kita sudah melihat kerangka switch dengan beberapa case dan satu default. Sekarang kita akan menelaah kedua konstruksi ini lebih dalam: bagaimana compiler menemukan label yang cocok, urutan case yang bebas (boleh tidak urut), bagaimana beberapa case bisa berbagi blok yang sama, serta peran default sebagai jaring pengaman. Pemahaman tentang case dan default membantu kita menulis switch yang ringkas, benar, dan tahan terhadap nilai tak terduga.
Label case sebagai Lompatan #
Berdasarkan ISO/IEC 9899 §6.8.5.3, case label berbentuk case konstanta-ekspresi:. Compiler mengubah switch menjadi tabel lompatan (jump table atau branch table) bila jumlah label cukup banyak dan berdekatan, sehingga pencarian label yang cocok menjadi operasi O(1). Yang penting dipahami: case hanyalah label tujuan lompatan, bukan blok terpisah. Begitu compiler melompat ke sebuah case, eksekusi berlanjut menurun baris demi baris sampai bertemu break atau akhir switch.
#include <stdio.h>
int main(void) {
int bulan = 8;
switch (bulan) {
case 1: printf("Januari\n"); break;
case 2: printf("Februari\n"); break;
case 3: printf("Maret\n"); break;
case 4: printf("April\n"); break;
case 5: printf("Mei\n"); break;
case 6: printf("Juni\n"); break;
case 7: printf("Juli\n"); break;
case 8: printf("Agustus\n"); break;
case 9: printf("September\n"); break;
case 10: printf("Oktober\n"); break;
case 11: printf("November\n"); break;
case 12: printf("Desember\n"); break;
default: printf("Nomor bulan tidak valid\n"); break;
}
return 0;
}Output yang Dihasilkan:
AgustusMari kita telaah baris-baris kode di atas:
- Baris 5 (
switch (bulan)): compiler mengevaluasibulan(8) dan mencari labelcase 8:. - Baris 13 (
case 8:): label ditemukan. Eksekusi melompat ke statement setelah label, yaituprintf("Agustus\n");. - Baris 13 (
break;setelah printf):breakmenghentikan eksekusiswitchdan keluar dari blok. - Baris 14 (
case 9:dst.): tidak dievaluasi karenabreaksudah keluar dariswitch.
Beberapa Label untuk Satu Blok #
C memperbolehkan beberapa case label menunjuk ke blok statement yang sama. Pola ini bermanfaat saat beberapa nilai berbeda perlu diperlakukan identik—misalnya hari kerja vs akhir pekan. Karena case hanyalah label, beberapa label berurutan tanpa statement di antaranya akan mengalir ke blok yang sama.
#include <stdio.h>
int main(void) {
int hari = 3;
/* Beberapa case label menunjuk ke blok yang sama */
switch (hari) {
case 1:
case 2:
case 3:
case 4:
case 5:
printf("Hari kerja\n");
break;
case 6:
case 7:
printf("Akhir pekan\n");
break;
default:
printf("Nomor hari tidak valid\n");
break;
}
return 0;
}Output yang Dihasilkan:
Hari kerjaPada contoh di atas, label case 1: sampai case 5: berurutan tanpa statement di antaranya. Compiler memperlakukan kelima label sebagai tujuan lompatan menuju printf("Hari kerja\n"); diikuti break;. Begitu hari = 3 cocok dengan case 3:, eksekusi melompat ke statement pertama setelah baris-baris label berurutan tersebut.
Peran default #
Label default adalah cabang yang dipilih bila tidak ada case yang cocok. default bersifat opsional—bila tidak ada dan tidak ada case yang cocok, eksekusi switch dilewati sepenuhnya. Namun praktik baik selalu menyertakan default untuk menangani nilai tak terduga (input pengguna, data dari jaringan, atau bug di tempat lain).
Berdasarkan ISO/IEC 9899 §6.8.5.3, urutan default di dalam switch bebas. default tidak harus berada di akhir—compiler tetap memperlakukannya sebagai cabang terakhir yang dicoba bila tidak ada case yang cocok.
#include <stdio.h>
int main(void) {
int kode_http = 404;
/* default boleh di tengah, tidak harus di akhir */
switch (kode_http) {
case 200:
printf("OK\n");
break;
default:
printf("Status tidak dikenal: %d\n", kode_http);
break;
case 404:
printf("Tidak ditemukan\n");
break;
case 500:
printf("Kesalahan server\n");
break;
}
return 0;
}Output yang Dihasilkan:
Tidak ditemukanPada contoh di atas, kode_http = 404. Compiler membandingkan dengan case 200 (tidak cocok), lalu—karena default bukan pencocokan, hanya cadangan—compiler terus mencari case 404 dan menemukannya. Eksekusi melompat ke printf("Tidak ditemukan\n"); lalu break.
Aturan Penting case dan default #
Beberapa aturan yang perlu diingat:
caseharus berupa konstanta integer. Tidak boleh variabel, tidak bolehfloat, tidak boleh string. Boleh berupa literal (case 5:), konstanta simbolik (#define MAX 5lalucase MAX:), atauenum.caseharus unik. Dua label dengan nilai sama di dalamswitchyang sama menyebabkan kesalahan kompilasi.defaultmaksimal satu perswitch. Lebih dari satudefaultadalah kesalahan.casedandefaulthanya boleh di dalamswitch. Memakai keduanya di luarswitchadalah kesalahan sintaks.
Pada chapter berikutnya kita akan menelaah peran break di dalam switch lebih dalam—serta apa yang terjadi bila break sengaja dihilangkan untuk memanfaatkan pola fallthrough.