Tidak semua keputusan dalam program hanya punya dua kemungkinan. Sering kali kita perlu memilih satu dari tiga, empat, atau lebih cabang yang saling eksklusif: menentukan predikat nilai dari rentang A hingga E, menerjemahkan angka 1–7 menjadi nama hari, atau menetapkan tarif pajak berdasarkan kelompok penghasilan. Untuk kasus seperti ini, C menyediakan pola else if—rantai kondisi yang dievaluasi berurutan dari atas ke bawah. Pada chapter ini kita akan memakai pola else if untuk menangani banyak cabang, memahami urutan evaluasi, dan menelaah praktik menyusun kondisi berurutan.
Sintaks else if #
Bentuk else if sebetulnya adalah else yang di dalamnya terdapat if lain. Pola umumnya seperti ini:
if (kondisi_1) {
/* cabang 1 */
} else if (kondisi_2) {
/* cabang 2 */
} else if (kondisi_3) {
/* cabang 3 */
} else {
/* cabang default bila tidak ada yang cocok */
}Compiler mengevaluasi kondisi_1 lebih dulu. Jika true, cabang pertama dieksekusi dan seluruh rantai else if berikutnya dilewati. Jika false, kondisi_2 dievaluasi, demikian seterusnya. Jika tidak ada kondisi yang true, cabang else terakhir (bila ada) yang dieksekusi.
#include <stdio.h>
int main(void) {
int nilai = 78;
if (nilai >= 90) {
printf("Nilai %d: predikat A\n", nilai);
} else if (nilai >= 80) {
printf("Nilai %d: predikat B\n", nilai);
} else if (nilai >= 70) {
printf("Nilai %d: predikat C\n", nilai);
} else if (nilai >= 60) {
printf("Nilai %d: predikat D\n", nilai);
} else {
printf("Nilai %d: predikat E (tidak lulus)\n", nilai);
}
return 0;
}Output yang Dihasilkan:
Nilai 78: predikat CMari kita telaah baris-baris kode di atas:
- Baris 6 (
if (nilai >= 90)): kondisi78 >= 90dievaluasi menjadi0(false). Cabang pertama dilewati. - Baris 8 (
else if (nilai >= 80)): kondisi78 >= 80juga0. Cabang kedua dilewati. - Baris 10 (
else if (nilai >= 70)): kondisi78 >= 70menghasilkan1(true). Cabang ini dieksekusi dan pesan predikat C tercetak. - Baris 12 dan 14 (
else ifdanelse): tidak dievaluasi lagi. Begitu satu cabang true terpenuhi, seluruh cabang berikutnya dilewati.
else if untuk Pemetaan Konstan #
Pola else if juga cocok untuk memetakan nilai diskrit ke label. Contoh klasik adalah menerjemahkan kode hari (1–7) menjadi nama hari. Pola ini bersifat eksklusif: hanya satu cabang yang dipilih.
#include <stdio.h>
int main(void) {
int hari = 3;
if (hari == 1) {
printf("Senin\n");
} else if (hari == 2) {
printf("Selasa\n");
} else if (hari == 3) {
printf("Rabu\n");
} else if (hari == 4) {
printf("Kamis\n");
} else if (hari == 5) {
printf("Jumat\n");
} else if (hari == 6) {
printf("Sabtu\n");
} else if (hari == 7) {
printf("Minggu\n");
} else {
printf("Nomor hari tidak valid\n");
}
return 0;
}Output yang Dihasilkan:
RabuPada contoh di atas, compiler mengevaluasi hari == 1, hari == 2, lalu hari == 3 secara berurutan. Begitu hari == 3 menghasilkan 1 (true), cabang “Rabu” dieksekusi dan rantai berhenti. Untuk pola pemetaan konstan seperti ini, switch (yang akan kita pelajari pada chapter selanjutnya) biasanya lebih ringkas dan jelas.
Urutan Kondisi pada else if itu Penting #
Saat menyusun else if dengan rentang nilai, urutan evaluasi menentukan apakah logika benar. Kondisi dievaluasi dari atas ke bawah, dan cabang pertama yang true akan dipilih. Karena itu, kita harus menempatkan kondisi yang lebih spesifik atau lebih ketat di atas, lalu mengendurkannya ke bawah.
#include <stdio.h>
int main(void) {
/* Urutan rentang penting: cek yang lebih ketat dulu */
long gaji_tahunan = 75000000L;
if (gaji_tahunan < 60000000L) {
printf("Pajak 0 persen\n");
} else if (gaji_tahunan < 250000000L) {
printf("Pajak 5 persen\n");
} else if (gaji_tahunan < 500000000L) {
printf("Pajak 15 persen\n");
} else {
printf("Pajak 25 persen\n");
}
return 0;
}Output yang Dihasilkan:
Pajak 5 persenPada contoh di atas, gaji_tahunan = 75000000L. Evaluasi berjalan sebagai berikut: 75000000 < 60000000 → 0 (false), lalu 75000000 < 250000000 → 1 (true). Cabang “Pajak 5 persen” dipilih dan sisa rantai dilewati.
Kapan else if dan Kapan switch #
Rantai else if bekerja pada kondisi apa pun—perbandingan rentang, ekspresi logika, hingga pemanggilan fungsi. Sebaliknya, switch hanya bekerja pada nilai konstan dari tipe integer (int, char, enum) dan tidak bisa dipakai untuk membandingkan rentang. Bila setiap cabang hanya membandingkan variabel dengan konstanta yang berbeda, switch sering kali lebih jelas dan lebih cepat. Bila cabang melibatkan rentang atau ekspresi kompleks, else if tetap menjadi pilihan utama.
Pada chapter berikutnya kita akan menelaah if yang berada di dalam if lain—pola nested if yang sering membingungkan karena masalah dangling else.