Sebelum kita membahas if, else, atau switch, kita perlu berdiri di atas konsep yang lebih mendasar: bagaimana C menentukan apakah sesuatu itu “benar” atau “salah”. Bahasa C—terutama dialek klasik C89—sebenarnya tidak memiliki tipe boolean bawaan yang berdiri sendiri. C mengevaluasi kondisi berdasarkan nilai numerik: 0 berarti false, dan nilai apa pun selain 0 berarti true. Aturan sederhana ini menentukan bagaimana if, while, dan operator logika bekerja di balik layar. Pada Chapter ini kita akan memetakan aturan boolean di C, mengenal tipe _Bool dari C99, serta menelusuri jebakan klasik seperti tertukarnya operator = dan ==.

Aturan True dan False pada C #

Pada C, ketika compiler menemukan sebuah ekspresi di posisi kondisi (misalnya di dalam if (ekspresi)), compiler mengevaluasi ekspresi tersebut menjadi sebuah nilai numerik. Jika nilainya sama dengan 0, kondisi dianggap false. Jika nilainya tidak sama dengan 0—termasuk 1, -1, 5, atau bahkan 0.0001—kondisi dianggap true. Tidak ada tipe boolean eksplisit yang dipakai untuk menampung hasil ini; yang ada hanyalah int yang bernilai 0 atau 1.

c
#include <stdio.h>
#include <stdbool.h>

int main(void) {
    /* C mengukur kebenaran dari nilai numerik */
    int nilai = 0;
    int jumlah = 7;

    if (nilai) {
        printf("nilai dievaluasi sebagai true\n");
    } else {
        printf("nilai dievaluasi sebagai false\n");
    }

    if (jumlah) {
        printf("jumlah dievaluasi sebagai true\n");
    } else {
        printf("jumlah dievaluasi sebagai false\n");
    }
    return 0;
}

Output yang Dihasilkan:

text
nilai dievaluasi sebagai false
jumlah dievaluasi sebagai true

Mari kita telaah baris-baris kode di atas:

  1. Baris 6 (int nilai = 0;): variabel nilai diisi 0; di C, 0 adalah satu-satunya representasi false.
  2. Baris 7 (int jumlah = 7;): variabel jumlah diisi 7; karena 7 bukan 0, ekspresi jumlah bernilai true saat diuji oleh if.
  3. Baris 9 (if (nilai)): compiler membaca nilai nilai (0) dan memilih cabang else.
  4. Baris 13 (if (jumlah)): compiler membaca 7, cabang true dipilih, dan printf di dalam blok dijalankan.

Tipe _Bool dan Header <stdbool.h> #

C99 memperkenalkan tipe asli _Bool yang hanya bisa menyimpan 0 atau 1. Header <stdbool.h> menyediakan alias yang lebih ramah manusia: bool, true, dan false. Kombinasi ini membuat kode modern C terbaca seperti bahasa ber-boolean asli, sambil tetap menjaga kompatibilitas dengan aturan numerik klasik di atas.

c
#include <stdio.h>
#include <stdbool.h>

int main(void) {
    /* Tipe _Bool dan header <stdbool.h> */
    bool sedang_login = true;
    bool punya_kuota = false;

    printf("sedang_login = %d\n", sedang_login);
    printf("punya_kuota  = %d\n", punya_kuota);

    if (sedang_login && !punya_kuota) {
        printf("Pengguna login tetapi kuota habis\n");
    }

    /* Ekspresi perbandingan menghasilkan int 0 atau 1 */
    int hasil = (5 > 3);
    printf("hasil (5 > 3) = %d\n", hasil);
    return 0;
}

Output yang Dihasilkan:

text
sedang_login = 1
punya_kuota  = 0
Pengguna login tetapi kuota habis
hasil (5 > 3) = 1

Pada kode di atas, variabel sedang_login bertipe bool (alias _Bool) dan dicetak dengan %d karena di C bool tetap tersimpan sebagai 0 atau 1. Operator logika && (AND), || (OR), dan ! (NOT) menghasilkan nilai int bertipe 0 atau 1, persis seperti hasil perbandingan 5 > 3.

Operator Perbandingan dan Operator Logika #

C menyediakan enam operator perbandingan (==, !=, <, >, <=, >=) dan tiga operator logika (&&, ||, !). Ketujuh operator ini menghasilkan int bernilai 0 atau 1, bukan nilai asli operand. Operator logika di C melakukan short-circuit evaluation: jika hasil sudah bisa ditentukan dari operand pertama, operand kedua tidak dievaluasi sama sekali.

c
#include <stdio.h>
#include <stdbool.h>

int main(void) {
    /* Jebakan umum: penugasan vs perbandingan */
    int a = 0;

    if (a = 5) {           /* = bukan == */
        printf("a sekarang bernilai %d dan dianggap true\n", a);
    }

    int b = 10;
    if (b == 10) {          /* perbandingan yang benar */
        printf("b sama dengan 10\n");
    }

    /* Operator logika short-circuit */
    int x = 0;
    if (x != 0 && (10 / x) > 1) {   /* short-circuit melindungi dari pembagian nol */
        printf("Tidak akan pernah tercetak\n");
    } else {
        printf("Short-circuit menyelamatkan dari pembagian nol\n");
    }
    return 0;
}

Output yang Dihasilkan:

text
a sekarang bernilai 5 dan dianggap true
b sama dengan 10
Short-circuit menyelamatkan dari pembagian nol

Perhatikan kode di atas. Baris if (a = 5) bukan perbandingan, melainkan penugasan: nilai 5 dimasukkan ke a, lalu nilai ekspresi tersebut (5) dipakai sebagai kondisi. Karena 5 bukan 0, cabang true dipilih. Compiler GCC memunculkan peringatan -Wparentheses untuk pola ini—kita sengaja membiarkannya di sini agar pembaca melihat betapa informatifnya warning tersebut.

Short-Circuit Evaluation #

Operator && dan || di C bersifat short-circuit. Untuk &&, jika operand kiri bernilai false, operand kanan tidak dievaluasi sama sekali—hasilnya pasti false. Untuk ||, jika operand kiri bernilai true, operand kanan tidak dievaluasi—hasilnya pasti true. Pada contoh di atas, ekspresi x != 0 && (10 / x) > 1 aman dari pembagian nol karena x != 0 dievaluasi lebih dulu; ketika hasilnya false, sub-ekspresi (10 / x) > 1 tidak pernah dieksekusi.

Pemahaman tentang boolean di C—nilai numerik sebagai truth value, tipe _Bool, operator logika, dan short-circuit—menjadi pondasi untuk seluruh konstruksi percabangan pada chapter-chapter selanjutnya. Pada chapter berikutnya kita akan memakai pondasi ini di dalam if sederhana.