Untuk apa switch
switch membandingkan satu nilai dengan daftar pilihan tetap lalu menjalankan cabang yang cocok. Kalau kamu sadar sedang menulis rangkaian panjang if/else if yang terus menguji variabel yang sama terhadap konstanta yang berbeda-beda, switch menyampaikan maksud itu dengan lebih jelas, dan sering dikompilasi menjadi jump table yang lebih cepat.
Ia hanya melakukan pengecekan kesamaan terhadap konstanta yang diketahui saat kompilasi, pada nilai yang mirip integer. Ia tidak bisa menguji rentang, membandingkan string, atau menggabungkan kondisi. Untuk semua itu, tetap pakai if/else.
switch dasar
Kamu memberi switch sebuah nilai, lalu menulis label case untuk nilai-nilai yang kamu pedulikan. Setiap cabang diakhiri dengan break:
Nilai 3 cocok dengan case 3:, jadi "Wednesday" dicetak dan break melompat keluar dari switch. Cabang default adalah penampung untuk semua sisanya: ia dijalankan saat tidak ada case yang cocok. Cabang ini opsional, tapi sertakan kecuali kamu yakin setiap nilai sudah ditangani.
Perhatikan bahwa label case berupa konstanta polos yang diikuti titik dua, bukan kondisi. Kamu menulis case 3:, tidak pernah case day == 3:.
break dan fall-through
Inilah jebakan switch yang paling penting di C++. Setelah sebuah case cocok, eksekusi tidak berhenti di case berikutnya: ia terus berjalan lurus sampai bertemu break atau kurung kurawal penutup. Perhatikan apa yang terjadi kalau pernyataan break tidak ada:
Mungkin kamu mengira hanya "one" yang dicetak. Ternyata keempat baris tercetak: kecocokan di case 1: membuat eksekusi masuk ke switch di sana lalu jatuh terus (fall through) melewati setiap label di bawahnya. Tambahkan break; setelah setiap cabang, dan kamu mendapat satu baris yang kamu inginkan. Lupa menulis break adalah sumber klasik bug "kenapa switch-ku menjalankan terlalu banyak kode?".
Fall-through yang disengaja untuk mengelompokkan case
Fall-through tidak selalu kesalahan. Ini adalah cara yang lazim untuk membuat beberapa case memakai satu isi yang sama. Biarkan case-nya kosong (tanpa pernyataan, tanpa break), maka semuanya akan mengalir ke blok berikutnya:
'A', 'B', dan 'C' semuanya sampai di baris "Pass" yang sama karena dua case pertama kosong dan jatuh ke case ketiga. Ini rapi dan memang disengaja. Kalau kamu memang bermaksud fall through setelah menjalankan sebagian kode, dokumentasikan dengan komentar, atau di C++17 ke atas dengan atribut [[fallthrough]];, yang memberi tahu compiler "ya, aku memang bermaksud begini" dan mematikan peringatan fall-through.
switch pada enum
switch cocok dipadukan dengan enum, karena enum memang berarti "salah satu dari sekumpulan nilai yang tetap". Compiler juga bisa memperingatkanmu kalau kamu lupa menangani salah satu enumerator-nya:
Dengan enum class yang scoped, kamu harus menulis label lengkap dengan namanya (Direction::East). Karena setiap enumerator sudah ditangani, default tidak diperlukan, dan banyak compiler akan memberi peringatan kalau nanti kamu menambahkan arah kelima tapi lupa menambahkan case-nya. Bantuan compiler itulah alasan besar untuk lebih memilih switch daripada rangkaian if/else untuk enum.
Jebakan: deklarasi di dalam case
Kamu tidak bisa mendeklarasikan variabel dengan nilai awal di satu case lalu membuatnya terlihat di case-case lain tanpa memberinya scope. Ini error kompilasi yang umum:
switch (x) {
case 1:
int n = 10; // error: jump to case 2 bypasses this initialization
cout << n;
break;
case 2:
cout << "two";
break;
}
Compiler menolaknya karena masuk ke case 2: akan melewati inisialisasi n padahal n masih berada di dalam scope. Solusinya adalah membungkus isi case dengan kurung kurawalnya sendiri, sehingga variabel itu punya blok sendiri:
Setiap kali sebuah case butuh variabel lokalnya sendiri, beri ia kurung kurawal. Cara ini juga mencegah variabel itu bocor ke case-case di bawahnya.
Berikutnya: for loop
switch dan if membuat programmu memilih kode mana yang dijalankan sekali. Tapi banyak pekerjaan berarti melakukan hal yang sama berkali-kali: menghitung, menelusuri daftar, mengulang sampai sebuah kondisi berubah. for loop adalah andalan untuk itu, dan itulah halaman berikutnya.
Pertanyaan yang sering diajukan
Kapan sebaiknya memakai switch alih-alih if-else di C++?
Pakai switch kalau kamu membandingkan satu nilai mirip integer dengan banyak pilihan tetap yang konstan, seperti pilihan menu, nomor hari, atau enum. Ia lebih jelas dibaca daripada rangkaian panjang if/else if dan memungkinkan compiler mengoptimalkan percabangannya. Tetap pakai if/else kalau kondisimu melibatkan rentang (x > 10), nilai floating-point, string, atau beberapa variabel, karena switch tidak bisa menangani semua itu.
Kenapa aku butuh break di pernyataan switch C++?
Begitu sebuah case cocok, C++ terus menjalankan case-case berikutnya sampai bertemu break atau akhir switch. Ini disebut fall-through. break menghentikannya. Lupa menulis break adalah bug klasik: kamu cocok di case 1: lalu tanpa sengaja juga menjalankan kode untuk case 2, case 3, dan default.
Tipe apa saja yang bisa dipakai di switch C++?
Hanya tipe integral atau enumerasi: int, char, short, long, bool, enum scoped maupun unscoped, dan apa pun yang bisa dikonversi ke salah satunya. Kamu tidak bisa memakai switch pada double, float, atau std::string, jadi pakai if/else untuk tipe-tipe itu. Setiap label case harus berupa konstanta yang diketahui saat kompilasi.