if saja baru memberi satu jalur: jalankan bila benar, lewati bila salah. Dunia nyata hampir selalu menuntut jalur kedua — bila pengguna benar memasukkan password, buka halaman utama; bila salah, tampilkan pesan galat. Di sinilah else berperan: ia menampung blok yang dijalankan tepat ketika kondisi if bernilai false. Pada Chapter ini kita membangun percabangan dua jalur, menyusun if di dalam if, lalu membahas satu jebakan klasik bernama dangling else yang menjelaskan mengapa kurung kurawal sebaiknya tidak pernah dikorbankan.

Dua Jalur dengan if-else #

Struktur if-else menjamin salah satu dari dua blok PASTI dijalankan — tidak ada kemungkinan keduanya maupun keduanya dilewati, karena kondisi bool hanya punya dua nilai. Mari kita gunakannya untuk menentukan kelulusan:

cpp
#include <iostream>

int main() {
    int nilai = 74;

    if (nilai >= 75) {
        std::cout << "Nilai: " << nilai << "\n";
        std::cout << "Status: LULUS\n";
    } else {
        std::cout << "Nilai: " << nilai << "\n";
        std::cout << "Status: TIDAK LULUS\n";
    }

    return 0;
}

Output yang Dihasilkan:

text
Nilai: 74
Status: TIDAK LULUS

Kondisi nilai >= 75 dievaluasi menjadi false karena 74 di bawah batas, sehingga compiler memilih blok else pada baris 12-14. Bila nilai kita ganti menjadi 90, blok if yang terpilih dan kedua baris statusnya berubah serentak. Dengan else, kedua cabang berbagi satu titik keputusan yang sama — lebih jelas daripada menulis dua if terpisah dengan dua perbandingan yang harus kita jaga tetap konsisten (>= 75 dan < 75). Pasangan if-else ini satu kesatuan dalam spesifikasi bahasa; rinciannya ada di cppreference .

Menyusun if di Dalam if #

Blok if maupun else boleh berisi pernyataan apa pun, termasuk if lain — pola ini disebut bersarang (nested). Logikanya: keputusan dalam hanya dievaluasi bila keputusan luar terpenuhi. Contoh berikut menghitung diskon berdasarkan status member dan total belanja:

cpp
#include <iostream>

int main() {
    int total = 250000;
    bool member = true;

    // if di dalam if: kedua kondisi harus benar untuk diskon besar
    if (member) {
        if (total >= 200000) {
            std::cout << "Diskon member besar: 20%\n";
        } else {
            std::cout << "Diskon member kecil: 10%\n";
        }
    } else {
        std::cout << "Diskon non-member: 5%\n";
    }

    return 0;
}

Output yang Dihasilkan:

text
Diskon member besar: 20%

Alurnya mudah dilacak: member bernilai true, sehingga kita masuk ke blok if luar; di dalamnya, total >= 200000 juga true, sehingga pesan diskon besar tercetak. Bila member bernilai false, seluruh keputusan di dalam blok if luar dilewati tanpa dievaluasi sedikit pun, dan program melompat langsung ke blok else luar. Bersarang dua tingkat masih mudah dibaca; bila sudah mencapai tiga tingkat atau lebih, biasanya itu sinyal untuk menata ulang logika — salah satu caranya adalah rantai else if yang kita bahas pada Chapter berikutnya.

Kurung Kurawal dan Jebakan Dangling else #

Secara resmi, badan if atau else boleh berupa SATU pernyataan tanpa kurung kurawal. Jika kita butuh lebih dari satu pernyataan, kurung kurawal menjadi wajib karena itulah yang mengikat beberapa pernyataan menjadi satu blok. Masalahnya, aturan “satu pernyataan tanpa kurawal” menyimpan jebakan bernama dangling else. Perhatikan potongan yang tampak masuk akal ini:

cpp Potongan bermasalah: else menempel ke if yang salah
if (member)
    if (total >= 200000)
        std::cout << "Diskon member besar: 20%\n";
else
    std::cout << "Diskon non-member: 5%\n";   // TIDAK sesuai niat penulisnya

Bacaannya di layar tampak seperti: “bila member … selain itu tampilkan diskon non-member”. Tetapi aturan bahasa menyatakan else selalu menempel ke if TANPA pasangan yang terdekat — dan yang terdekat di sini adalah if (total >= 200000), bukan if (member). Akibatnya pesan “Diskon non-member” hanya muncul bila pengguna member TETAPI belanjanya di bawah 200000; pengguna non-member tidak menerima pesan apa pun. Compiler mengizinkan kode ini tanpa keluhan, sehingga bug semacam ini bisa lolos sampai dipakai di produksi.

Versi yang sesuai niat penulisnya memakai kurung kurawal untuk menandai blok yang benar:

cpp Versi yang benar
if (member) {
    if (total >= 200000) {
        std::cout << "Diskon member besar: 20%\n";
    }
} else {
    std::cout << "Diskon non-member: 5%\n";
}

Kebiasaan baik lainnya adalah menjaga indentasi tetap jujur: setiap if dan else yang sepasang berada pada kolom yang sama, seperti pada cek-diskon.cpp. Editor modern dapat memformat otomatis, jadi tidak ada alasan menulis cabang yang menyala-sip. Dengan if-else dan bersarang, kita sebenarnya sudah bisa menulis keputusan sebanyak apa pun — tetapi rantai tiga, empat, lima kategori akan terlihat makin dalam dan makin sulit dibaca. Chapter berikutnya menyodorkan else if, pola yang meratakan bersarang menjadi daftar pemeriksaan yang rapi.