Sampai bab ini, program yang kita tulis selalu berjalan lurus dari baris pertama sampai baris terakhir. Padahal hampir semua masalah nyata butuh keputusan: apakah stok masih ada, apakah nilai ujian mencapai batas lulus, apakah pengguna sudah login. Pernyataan if adalah alat paling dasar untuk itu — ia mengeksekusi sebuah blok kode hanya bila kondisinya benar, dan melewatinya bila salah. Pada Chapter ini kita mempelajari bentuk dasar if, jenis kondisi apa yang boleh ditulis di dalam tanda kurung, satu kesalahan ketik yang sangat sering menjerat pemula, serta varian yang mendeklarasikan variabel langsung di dalam kondisinya.

Bentuk Dasar Pernyataan if #

Bentuk umum if terdiri dari tiga bagian: kata kunci if, kondisi di dalam tanda kurung, dan blok pernyataan di dalam kurung kurawal. Kondisi dievaluasi menjadi nilai bool — true atau false, seperti yang sudah kita kenal pada Chapter Operator Perbandingan. Bila hasilnya true, blok dijalankan; bila false, seluruh blok dilewati dan program berlanjut ke baris sesudahnya. Mari kita lihat program yang memeriksa stok barang:

cpp
#include <iostream>

int main() {
    int stok = 3;

    // Kondisi bernilai true: blok dijalankan
    if (stok > 0) {
        std::cout << "Barang tersedia: " << stok << " unit\n";
    }

    // Kondisi bernilai false: blok dilewati sama sekali
    if (stok == 0) {
        std::cout << "Stok habis\n";
    }

    std::cout << "Pemeriksaan selesai\n";
    return 0;
}

Output yang Dihasilkan:

text
Barang tersedia: 3 unit
Pemeriksaan selesai

Mari kita bedah mekanismenya:

  1. Baris 5 (int stok = 3;): variabel stok menyimpan data yang akan diperiksa. Nilainya bisa berasal dari mana saja — input pengguna, hasil perhitungan, atau data dari file.
  2. Baris 8 (if (stok > 0)): ekspresi stok > 0 dievaluasi menjadi true karena 3 lebih besar dari 0, sehingga blok pada baris 9 dijalankan.
  3. Baris 12 (if (stok == 0)): kali ini kondisinya false karena stok bernilai 3, bukan 0. Pesan “Stok habis” tidak pernah tercetak.
  4. Baris 16: eksekusi kembali mengalir lurus — if yang dilewati tidak meninggalkan jejak apa pun pada alur program.

Perhatikan bahwa kedua if di atas diperiksa satu per satu secara independen. Compiler tidak menganggap keduanya saling terkait; untuk kasus “bila tidak, lakukan yang lain” kita butuh else, yang dibahas pada Chapter berikutnya.

Kondisi dan Konversi ke bool #

Tanda kurung if menerima ekspresi apa pun yang dapat dikonversi menjadi bool. Perbandingan seperti stok > 0 menghasilkan bool secara langsung, tetapi nilai bertipe angka juga diterima: 0 dikonversi menjadi false, dan nilai selain nol menjadi true. Artinya if (stok) sah secara hukum bahasa dan berarti “bila stok bukan nol”. Meskipun sah, kita menyarankan menulis perbandingan secara eksplisit seperti if (stok != 0) agar maksud kode terbaca jelas oleh rekan tim. Aturan konversi ini juga berlaku untuk tipe lain, misalnya pointer (dibahas pada Section Pointer dan Reference) yang dikonversi false bila bernilai null. Spesifikasi lengkap if, termasuk varian inisialisasi, ada di cppreference .

Kesalahan Umum: = versus == #

Kesalahan ketik paling legendaris di C++ adalah menulis satu tanda sama dengan (=, operator assignment) padahal maksudnya dua (==, operator perbandingan). Perhatikan potongan berikut — jangan dijalankan sebagai contoh baik:

cpp Potongan bermasalah
int stok = 0;
if (stok = 5) {   // SALAH: ini assignment, bukan perbandingan
    std::cout << "Stok habis\n";
}

Potongan ini tetap berhasil dikompilasi, karena stok = 5 adalah ekspresi yang mengembalikan nilai 5, dan 5 dikonversi menjadi true. Akibatnya blok dijalankan SELALU, tanpa peduli nilai stok sebenarnya — dan efek sampingnya, stok ikut berubah menjadi 5. Yang menyelamatkan kita adalah flag -Wall: compiler mendeteksi pola ini dan memberi peringatan yang persis seperti ini saat kita mengompilasi potongan di atas dengan g++ -std=c++23 -Wall -Wextra:

text Peringatan compiler
bug-assignment.cpp: In function 'int main()':
bug-assignment.cpp:5:14: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
    5 |     if (stok = 5) {   // SALAH: = adalah assignment, bukan perbandingan
      |         ~~~~~^~~

Bila memang sengaja menulis assignment di dalam kondisi (pola yang langka dan mudah membingungkan), beberapa programmer menulisnya dengan tanda kurung ganda — if ((stok = bacaStok())) — untuk memberi tahu compiler bahwa mereka sadar apa yang dilakukan.

Deklarasi Variabel di Dalam Kondisi #

Sejak C++17, if boleh membawa sebuah inisialisasi sebelum kondisinya, dipisah titik koma: if (inisialisasi; kondisi). Variabel yang dideklarasikan di sana hanya hidup di dalam if — persis seperti scope variabel loop yang akan kita temui pada Chapter for Loop. Bentuk ini menjaga variabel bantu agar tidak bocor ke luar bloknya:

cpp
#include <iostream>

int main() {
    // Inisialisasi di dalam kondisi: sisa hanya hidup di dalam if
    if (int sisa = 10 - 7; sisa > 0) {
        std::cout << "Sisa stok: " << sisa << " unit\n";
    }

    return 0;
}

Output yang Dihasilkan:

text
Sisa stok: 3 unit

Ekspresi 10 - 7 dievaluasi sekali, hasilnya disimpan ke sisa, lalu sisa dipakai pada kondisi sisa > 0 dan di dalam blok. Setelah kurung kurawal penutup, nama sisa tidak lagi tersedia — kalau kita mencoba memakainya, compiler langsung menolak dengan pesan “not declared”. Pola ini terlihat sederhana di sini, tetapi menjadi sangat berguna saat kita memakai if constexpr untuk pemrograman generik — topik yang menanti pada Chapter if constexpr di Section Modern C++.

if memberi program kita kemampuan bercabang satu arah: jalankan bila benar, lewati bila salah. Namun keputusan nyata sering butuh jalur kedua — “bila lulus tampilkan sertifikat, jika tidak tampilkan jadwal remedial”. Chapter berikutnya melengkapi if dengan pasangan else.