Tidak semua keputusan bisa diambil dengan satu lapis pemeriksaan. Kadang kita harus memeriksa kondisi di dalam kondisi: misalnya, baru memeriksa kepemilikan SIM jika umur sudah cukup, atau baru memeriksa level pengguna jika sudah login. Pola ini diimplementasikan sebagai if yang berada di dalam blok if lain—disebut nested if. Pada chapter ini kita akan memakai nested if untuk logika berlapis, menelaah masalah klasik dangling else, serta mempelajari kapan sebaiknya pola nested diganti dengan else if atau dengan guard clause.

Sintaks if di Dalam if #

C memperbolehkan statement apa pun di dalam blok if, termasuk if lain. Susunan ini menggambarkan keputusan bertingkat: kondisi luar diperiksa dulu, dan bila terpenuhi, kondisi dalam baru diperiksa. Setiap tingkat nested if menambah kedalaman indentasi—dan karenanya menambah beban kognitif untuk membaca kode.

c
#include <stdio.h>

int main(void) {
    int umur = 25;
    int punya_sim = 1;   /* 1 = true, 0 = false */

    if (umur >= 17) {
        if (punya_sim) {
            printf("Boleh menyewa mobil\n");
        } else {
            printf("Umur cukup, tetapi wajib bikin SIM dulu\n");
        }
    } else {
        printf("Belum cukup umur\n");
    }
    return 0;
}

Output yang Dihasilkan:

text
Boleh menyewa mobil

Mari kita telaah baris-baris kode di atas:

  1. Baris 7 (if (umur >= 17)): kondisi pertama memeriksa apakah umur cukup. Karena 25 >= 17 = 1, blok di dalamnya dieksekusi.
  2. Baris 8 (if (punya_sim)): pemeriksaan kedua, hanya sampai sini jika pemeriksaan pertama lulus. punya_sim = 1 (true), maka blok printf("Boleh menyewa mobil\n") dijalankan.
  3. Baris 10 (else): milik if (punya_sim) di baris 8. Tidak dijalankan karena punya_sim true.
  4. Baris 13 (else): milik if (umur >= 17) di baris 7. Tidak dijalankan karena umur >= 17 true.

Jebakan Dangling Else #

Masalah dangling else muncul ketika ada if bertingkat tanpa kurung kurawal dan satu else di akhir. Karena else mengikat ke if terdekat yang belum dipasangkan, indentasi visual bisa menyesatkan—programmer mengira else mengikat ke if luar, padahal sebetulnya mengikat ke if dalam.

c
#include <stdio.h>

int main(void) {
    /* Demonstrasi dangling else */
    int a = 5, b = 0;

    if (a > 0)
        if (b > 0)
            printf("Keduanya positif\n");
        else
            printf("Else ini milik if (b>0), BUKAN if (a>0)\n");

    return 0;
}

Output yang Dihasilkan:

text
Else ini milik if (b>0), BUKAN if (a>0)

Pada kode di atas, walaupun indentasi terlihat seperti else milik if (a > 0), kompiler C memparse else sebagai milik if (b > 0) karena aturan dangling else. Compiler GCC juga memunculkan peringatan -Wdangling-else yang menyarankan penggunaan kurung kurawal eksplisit.

Solusi: Kurung Kurawal Eksplisit #

Cara termudah menghindari dangling else adalah selalu memakai kurung kurawal pada setiap if, sekalipun body-nya hanya satu statement. Dengan kurung kurawal, asosiasi else menjadi eksplisit dan kode terbaca persis seperti yang dimaksud.

c
#include <stdio.h>

int main(void) {
    /* Versi yang jelas dengan kurung kurawal */
    int a = 5, b = 0;

    if (a > 0) {
        if (b > 0) {
            printf("Keduanya positif\n");
        } else {
            printf("a positif, b bukan positif\n");
        }
    } else {
        printf("a tidak positif\n");
    }

    return 0;
}

Output yang Dihasilkan:

text
a positif, b bukan positif

Pada contoh ini, else di baris ke-12 terlihat jelas milik if (a > 0) karena pasangan } di baris 11 menutup blok if (b > 0) beserta else-nya sendiri. Cabang else di luar mengikat ke if (a > 0).

Kapan Mengganti Nested If #

Nested if yang terlalu dalam membuat logika sulit diikuti. Beberapa pola refactor yang umum:

  1. Konversi ke else if bila cabang bersifat saling eksklusif. Misalnya, if (a) { if (b) {...} } else { ... } dapat ditulis ulang dengan klarifikasi urutan kondisi.
  2. Guard clause—keluar lebih awal bila kondisi gagal—untuk meratakan indentasi. Pola if (!kondisi) return; di awal fungsi sering menggantikan nested if yang dalam.
  3. Ekstrak ke fungsi bila blok nested sudah berisi logika yang cukup besar. Memecah ke fungsi bernama deskriptif sering lebih jelas daripada komentar panjang.

Pada chapter berikutnya kita akan beralih ke switch—konstruksi percabangan berbasis konstanta yang sering menjadi alternatif lebih ringkas untuk rantai else if yang membandingkan variabel dengan banyak nilai tetap.