Seleksi kondisi adalah konsep pemrograman yang memungkinkan program untuk membuat keputusan berdasarkan kondisi yang diberikan. Tanpa seleksi kondisi, program hanya berjalan lurus dari baris pertama ke baris terakhir — tidak peduli apapun yang terjadi.
Bayangkan rambu lalu lintas: "Jika lampu hijau → jalan. Jika lampu merah → berhenti." Program dengan seleksi kondisi bekerja dengan logika yang persis sama — ia memeriksa suatu kondisi, lalu memilih tindakan yang tepat.
Bahasa C menyediakan dua perintah seleksi kondisi: if dan switch. Keduanya mengevaluasi kondisi, lalu memilih blok kode mana yang akan dieksekusi.
Ekspresi yang diperiksa oleh seleksi kondisi menggunakan operator relasi (== != > < >= <=) dan operator logika (&& || !) yang sudah dipelajari. Hasilnya selalu 1 (benar) atau 0 (salah) — itulah yang menentukan jalur mana yang dipilih.
if TunggalBentuk paling sederhana: jika kondisi benar, blok pernyataan dieksekusi. Jika kondisi salah, blok dilewati dan program lanjut ke baris berikutnya.
/* Satu pernyataan */ if (kondisi) pernyataan; /* Beberapa pernyataan — gunakan blok kurung kurawal */ if (kondisi) { pernyataan_1; pernyataan_2; pernyataan_n; }
#include <stdio.h> int main() { int nilai = 75; if (nilai >= 60) { printf("Selamat, Anda lulus!\n"); } printf("Program selesai.\n"); // selalu dieksekusi return 0; } /* Output (nilai=75): Selamat, Anda lulus! Program selesai. */ /* Output (nilai=50): Program selesai. */
{} meskipun hanya ada satu pernyataan di dalam blok if. Ini mencegah kesalahan logika ketika kode bertambah di kemudian hari.
if-elseMenambahkan blok alternatif yang dieksekusi ketika kondisi salah. Program selalu memilih salah satu dari dua jalur — tidak ada yang dilewati.
if (kondisi) { pernyataan_jika_benar; } else { pernyataan_jika_salah; }
#include <stdio.h> int main() { int nilai = 55; if (nilai >= 60) { printf("Status: LULUS\n"); } else { printf("Status: TIDAK LULUS\n"); } return 0; } /* Output (nilai=55): Status: TIDAK LULUS */
if – else if – elseKetika ada lebih dari dua kemungkinan kondisi, gunakan else if untuk menambahkan pemeriksaan bertingkat. Program memeriksa kondisi dari atas ke bawah — begitu satu kondisi benar, bloknya dieksekusi dan seluruh struktur dilewati.
if (kondisi_1) { pernyataan_1; } else if (kondisi_2) { pernyataan_2; } else if (kondisi_3) { pernyataan_3; } else { pernyataan_default; // jika tidak ada yang cocok }
#include <stdio.h> int main() { int nilai; printf("Masukkan nilai (0-100): "); scanf("%d", &nilai); if (nilai >= 85) { printf("Grade: A\n"); } else if (nilai >= 75) { printf("Grade: B\n"); } else if (nilai >= 65) { printf("Grade: BC\n"); } else if (nilai >= 55) { printf("Grade: C\n"); } else { printf("Grade: D (Tidak Lulus)\n"); } return 0; }
nilai >= 85 diperiksa lebih dulu, nilai 90 tidak akan "jatuh" ke else if di bawahnya meskipun 90 juga memenuhi nilai >= 75.
#include <stdio.h> int main() { int suhu = 28; if (suhu > 35) { printf("Sangat panas — nyalakan AC\n"); } else if (suhu >= 28 && suhu <= 35) { printf("Hangat — kipas cukup\n"); } else { printf("Sejuk — tidak perlu apa-apa\n"); } return 0; } /* Output (suhu=28): Hangat — kipas cukup */
switch-caseKetika program perlu memilih dari banyak nilai diskrit (nilai pasti, bukan rentang), switch menghasilkan kode yang jauh lebih rapi daripada deretan if-else if.
switch (variabel) { case nilai_1: pernyataan_1; break; case nilai_2: pernyataan_2; break; case nilai_3: pernyataan_3; break; default: pernyataan_default; break; }
Cara kerja: nilai variabel dibandingkan dengan tiap case dari atas ke bawah. Jika cocok, blok pernyataan pada case tersebut mulai dieksekusi.
Ini adalah perbedaan paling mendasar antara switch dan if-else. Ekspresi di dalam switch(...) hanya boleh bertipe bilangan bulat atau karakter — karena switch bekerja dengan nilai diskrit yang dapat dipetakan secara langsung.
| Tipe Data | if-else | switch | Alasan |
|---|---|---|---|
int |
✓ Bisa | ✓ Bisa | Bilangan bulat — nilai diskrit |
char |
✓ Bisa | ✓ Bisa | Karakter direpresentasikan sebagai int (ASCII) |
short, long |
✓ Bisa | ✓ Bisa | Turunan integer |
float |
✓ Bisa | ✗ Tidak | Bilangan pecahan tidak dapat dibandingkan secara eksak |
double |
✓ Bisa | ✗ Tidak | Bilangan pecahan presisi ganda |
string (char[]) |
✓ Bisa (dengan strcmp) | ✗ Tidak | Array — bukan nilai tunggal yang dapat dipetakan |
| Ekspresi rentang misal: nilai >= 60 |
✓ Bisa | ✗ Tidak | switch hanya cocok untuk nilai tunggal, bukan rentang |
if-else ketika kondisi melibatkan rentang nilai (misal: nilai antara 60–74), tipe float/double, perbandingan string, atau kondisi logika kompleks (&&, ||).
switch ketika variabelnya bertipe integer atau char, dan nilainya adalah pilihan-pilihan tertentu yang jelas — seperti menu pilihan (1/2/3), kode hari (1–7), atau kode operator ('+'/'-'/'*'/'/').
break dalam switch-caseIni adalah bagian yang paling sering menyebabkan bug pada pemula. Setelah sebuah case cocok dan mulai dieksekusi, program tidak berhenti secara otomatis di akhir blok case tersebut. Ia akan terus mengeksekusi case-case berikutnya ke bawah — fenomena ini disebut fall-through. Kata kunci break berfungsi menghentikan eksekusi dan keluar dari blok switch.
Fall-through adalah perilaku switch di mana eksekusi "jatuh" ke case berikutnya setelah case yang cocok selesai dieksekusi — jika tidak ada break. Program tidak memeriksa kondisi case berikutnya, ia langsung mengeksekusi isinya.
break vs Dengan breakint hari = 2; switch (hari) { case 1: printf("Senin\n"); case 2: printf("Selasa\n"); case 3: printf("Rabu\n"); case 4: printf("Kamis\n"); default: printf("???\n"); }
Selasa
Rabu
Kamis
???
int hari = 2; switch (hari) { case 1: printf("Senin\n"); break; case 2: printf("Selasa\n"); break; case 3: printf("Rabu\n"); break; case 4: printf("Kamis\n"); break; default: printf("???\n"); break; }
Selasa
break; di akhir setiap case, termasuk default. Melupakannya adalah salah satu sumber bug yang paling umum dalam switch-case.
/* fall-through */ agar kode tidak membingungkan.
int hari = 6; 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("Hari tidak valid\n"); break; } /* Output (hari=6): Akhir pekan */
defaultKlausa default dieksekusi ketika tidak ada satu pun case yang nilainya cocok dengan variabel. Mirip dengan else pada pernyataan if.
default bersifat opsional — switch tetap valid tanpa default
#include <stdio.h> int main() { float a = 10, b = 3, hasil; char op; printf("Masukkan operator (+,-,*,/): "); scanf("%c", &op); switch (op) { // char → valid di switch case '+': hasil = a + b; printf("%.1f + %.1f = %.1f\n", a, b, hasil); break; case '-': hasil = a - b; printf("%.1f - %.1f = %.1f\n", a, b, hasil); break; case '*': hasil = a * b; printf("%.1f * %.1f = %.1f\n", a, b, hasil); break; case '/': if (b != 0) { hasil = a / b; printf("%.1f / %.1f = %.2f\n", a, b, hasil); } else { printf("Error: pembagian dengan nol!\n"); } break; default: printf("Operator '%c' tidak dikenal.\n", op); break; } return 0; }
| Aspek | if-else | switch |
|---|---|---|
| Tipe data yang didukung | Semua tipe: int, float, double, char, string, dll. | Hanya int, char, dan turunannya |
| Jenis kondisi | Rentang nilai, ekspresi logika kompleks | Nilai diskrit/pasti saja |
| Operator logika | Bisa menggunakan &&, ||, ! | Tidak bisa |
| Keterbacaan kode | Bisa panjang jika banyak kondisi | Lebih rapi untuk banyak pilihan diskrit |
| Risiko bug | Lebih aman — tidak ada fall-through | Harus ingat break di setiap case |
| Cocok untuk | Grade nilai, validasi rentang, kondisi ganda | Menu pilihan, kode hari/bulan, operator karakter |
switch ketika kondisinya adalah "apakah variabel ini sama dengan nilai A, B, atau C?". Gunakan if-else untuk semua kasus lainnya — terutama rentang nilai, float, dan kondisi logika ganda.
Program berikut menggabungkan if-else if untuk grade dan switch untuk kategori hasil studi.
#include <stdio.h> int main() { int nilai; char grade; printf("Masukkan nilai (0-100): "); scanf("%d", &nilai); /* Validasi input dengan if-else */ if (nilai < 0 || nilai > 100) { printf("Nilai tidak valid!\n"); return 1; } /* Tentukan grade — if-else if untuk RENTANG */ if (nilai >= 85) grade = 'A'; else if (nilai >= 75) grade = 'B'; else if (nilai >= 65) grade = 'C'; else if (nilai >= 55) grade = 'D'; else grade = 'E'; printf("Nilai : %d\n", nilai); printf("Grade : %c\n", grade); /* Tampilkan keterangan — switch untuk NILAI DISKRIT */ switch (grade) { case 'A': printf("Hasil : Sangat Memuaskan\n"); break; case 'B': printf("Hasil : Memuaskan\n"); break; case 'C': printf("Hasil : Cukup\n"); break; case 'D': printf("Hasil : Kurang — perlu remidi\n"); break; default: printf("Hasil : Tidak Lulus\n"); break; } return 0; } /* Contoh output (nilai=78): Nilai : 78 Grade : B Hasil : Memuaskan */
if-else if untuk menentukan grade dari rentang nilai (hanya bisa dengan if), lalu switch untuk mencetak keterangan berdasarkan grade char yang sudah jelas nilainya (cocok untuk switch).
if tunggal — eksekusi blok jika kondisi benar, lewati jika salahif-else — dua jalur: satu jika benar, satu jika salahelse if bertingkat — periksa banyak kondisi berurutan dari atas ke bawahswitch hanya untuk tipe int dan char — tidak bisa float, double, atau stringbreak → fall-through: semua case di bawah case yang cocok ikut dieksekusidefault menangani nilai yang tidak cocok dengan case manapunif-else untuk rentang & logika kompleks; pilih switch untuk nilai diskrit yang rapi