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.

c
#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:

text
Agustus

Mari kita telaah baris-baris kode di atas:

  1. Baris 5 (switch (bulan)): compiler mengevaluasi bulan (8) dan mencari label case 8:.
  2. Baris 13 (case 8:): label ditemukan. Eksekusi melompat ke statement setelah label, yaitu printf("Agustus\n");.
  3. Baris 13 (break; setelah printf): break menghentikan eksekusi switch dan keluar dari blok.
  4. Baris 14 (case 9: dst.): tidak dievaluasi karena break sudah keluar dari switch.

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.

c
#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:

text
Hari kerja

Pada 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.

c
#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:

text
Tidak ditemukan

Pada 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:

  1. case harus berupa konstanta integer. Tidak boleh variabel, tidak boleh float, tidak boleh string. Boleh berupa literal (case 5:), konstanta simbolik (#define MAX 5 lalu case MAX:), atau enum.
  2. case harus unik. Dua label dengan nilai sama di dalam switch yang sama menyebabkan kesalahan kompilasi.
  3. default maksimal satu per switch. Lebih dari satu default adalah kesalahan.
  4. case dan default hanya boleh di dalam switch. Memakai keduanya di luar switch adalah 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.