Menu

If else di C: sintaks, contoh, dan kesalahan umum

Cara C mengambil keputusan: pernyataan if, else, rantai else if, if bersarang, dan operator ternary. Ditambah aturan kebenaran (0 berarti salah, selain itu benar) dan bug = vs == yang diam-diam merusak kondisi.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Kenapa program butuh percabangan

Semua program sejauh ini berjalan lurus: baris 1, baris 2, baris 3. Program sungguhan mengambil keputusan. Apakah password-nya benar? Apakah angkanya negatif? Apakah file-nya berhasil dibuka? Pernyataan if adalah cara C mengajukan pertanyaan dan menjalankan kode hanya kalau jawabannya ya.

Kondisi temperature > 30 diuji sekali. Kondisinya terpenuhi, jadi pesannya dicetak. Baris terakhir ada di luar kurung kurawal, jadi selalu dicetak apa pun yang terjadi. Ganti 31 menjadi 18 lalu jalankan lagi: pesan pertama hilang dan yang kedua tetap ada.

Sintaks: tanda kurung, kurung kurawal, dan tanpa titik koma

if di C punya bentuk yang tetap:

if (condition) {
    // runs when condition is nonzero
}

Ada tiga aturan yang sebaiknya dihafal sejak awal. Tanda kurung di sekitar kondisi wajib ada. Tidak ada kata kunci then. Dan tidak ada titik koma setelah tanda kurung penutup, karena titik koma yang nyasar akan langsung mengakhiri pernyataannya di situ:

// BUG: the if does nothing; the printf always runs
if (x > 10);
{
    printf("big\n");
}

Kode itu bisa dikompilasi tanpa masalah. ; adalah pernyataan kosong yang menjadi badan if, dan kurung kurawal di bawahnya hanyalah blok mandiri yang selalu dijalankan. Mengompilasi dengan gcc -Wall akan menangkapnya.

Kurung kurawal sendiri boleh dihilangkan untuk satu pernyataan, tapi sebaiknya tetap ditulis. if tanpa kurung kurawal yang kemudian ditambah baris kedua adalah sumber bug klasik, karena indentasi tidak mengelompokkan pernyataan di C.

else dan else if

else menyediakan jalur lainnya:

Untuk lebih dari dua kemungkinan, sambungkan dengan else if. C memeriksa setiap kondisi secara berurutan dan berhenti di kondisi pertama yang terpenuhi:

Urutan di sini sangat penting. Karena rantainya berhenti di kecocokan pertama, uji kedua hanya pernah melihat skor di bawah 90. Itulah sebabnya score >= 80 tidak perlu ditambah && score < 90. Tulis rantainya dari kondisi yang paling ketat ke yang paling longgar, atau semua nilai akan jatuh ke cabang pertama.

else di akhir boleh tidak ada. Tulislah setiap kali rantai itu memang harus mencakup semua kasus; kalau tidak ada, artinya "kalau tidak ada yang cocok, jangan lakukan apa-apa". Itu tidak salah, tapi harus disengaja.

Nilai kebenaran: 0 berarti salah, selain itu benar

Bahasa inti C tidak punya tipe boolean tersendiri untuk kondisi. if hanya menanyakan apakah ekspresinya bukan nol.

Dua baris terakhir menunjukkan separuh lain dari aturan ini: operator perbandingan adalah ekspresi biasa yang menghasilkan 1 untuk benar dan 0 untuk salah. Karena itulah if (5 > 2) bekerja: sebenarnya itu if (1).

Karena itu juga -3 dianggap benar di C. Aturannya adalah bukan nol, bukan positif. Kalau kamu ingin tahu apakah sebuah angka positif, tulis if (n > 0), bukan if (n).

C99 menambahkan <stdbool.h> dengan tipe bool sungguhan serta true dan false, yang lebih enak dibaca di kode baru. Di baliknya, keduanya tetap 1 dan 0, jadi aturan di atas tidak berubah sama sekali. Lihat halaman tentang boolean di C.

Operator perbandingan dan logika yang akan kamu pakai di kondisi:

==   equal to            &&   logical AND (both sides true)
!=   not equal to        ||   logical OR  (either side true)
<    less than           !    logical NOT
>    greater than
<=   less than or equal
>=   greater than or equal

&& dan || melakukan short-circuit: a && b tidak pernah mengevaluasi b kalau a salah, dan a || b tidak pernah mengevaluasi b kalau a benar. Ini jaminan, bukan optimasi, jadi aman untuk menulis if (n != 0 && total / n > 5): pembagiannya tidak mungkin berjalan saat n bernilai nol.

Bug = vs ==

Inilah kesalahan paling umum di kondisi C:

// BUG: assigns 5 to x, then tests 5 (nonzero), so this ALWAYS runs
if (x = 5) {
    printf("x is five\n");
}

C mengizinkan penugasan di dalam ekspresi, jadi baris itu sah. Baris itu menyimpan 5 ke x, menghasilkan nilai 5, dan 5 bukan nol: cabangnya berjalan setiap kali, dan x diam-diam sudah tertimpa.

Ada dua cara bertahan. Pertama, selalu kompilasi dengan peringatan menyala:

gcc -Wall -Wextra program.c -o program

GCC dan clang sama-sama menandainya dengan "suggest parentheses around assignment used as truth value". Kedua, sebagian programmer menulis konstanta sebelum variabel, if (5 == x), sehingga salah ketik if (5 = x) menjadi error kompilasi yang jelas, bukan bug yang diam-diam. Gaya itu soal selera; menyalakan peringatan tidak.

If bersarang

Sebuah if bisa berisi if lain. If bersarang menyatakan kondisi yang baru masuk akal setelah kondisi sebelumnya terpenuhi:

Dua tingkat masih mudah dibaca. Empat tingkat tidak. Saat sarangnya makin dalam, cari cara untuk meratakannya, sering kali dengan menggabungkan kondisi memakai &&, atau dengan menangani kasus gagal lebih dulu lalu return lebih awal:

// flatter: deal with the exceptions, then get on with the work
if (age < 18)     { printf("Adults only.\n");        return 0; }
if (!hasTicket)   { printf("Please buy a ticket.\n"); return 0; }
printf("Welcome in.\n");

Masalah dangling else

Saat if tanpa kurung kurawal ada di dalam if lain, else itu milik yang mana? Aturan C: else terikat ke if terdekat yang belum punya pasangan, tidak peduli bagaimana kodenya diindentasi.

// The else belongs to the INNER if, despite the indentation
if (a > 0)
    if (b > 0)
        printf("both positive\n");
else
    printf("a is not positive\n");   // WRONG - runs when a > 0 and b <= 0

Indentasinya mengatakan else itu berpasangan dengan if luar. Compiler memasangkannya dengan yang dalam. Kurung kurawal menghilangkan ambiguitas ini sepenuhnya, dan itulah alasan sebenarnya untuk selalu memakainya:

if (a > 0) {
    if (b > 0) {
        printf("both positive\n");
    }
} else {
    printf("a is not positive\n");
}

Operator ternary

Saat sebuah cabang hanya ada untuk memilih sebuah nilai, operator kondisional ? : menyatakannya dalam satu ekspresi:

Baca cond ? x : y sebagai "kalau cond maka x, kalau tidak y". Tepat satu dari dua cabang yang dievaluasi, dan keseluruhannya menghasilkan nilai. Karena itulah operator ini bisa diberikan ke variabel atau dikirim sebagai argumen di tempat pernyataan tidak bisa.

Pakai untuk pilihan nilai yang sederhana. Ternary bersarang (a ? b : c ? d : e) memang sah, tapi hampir selalu lebih sulit dibaca daripada rantai else if yang digantikannya.

Pertanyaan yang sering diajukan

Bagaimana cara menulis pernyataan if else di C?

Taruh kondisinya di dalam tanda kurung dan kodenya di dalam kurung kurawal: if (score >= 60) { printf("Pass\n"); } else { printf("Fail\n"); }. Blok else hanya berjalan saat kondisinya salah, dan C tidak punya kata kunci then.

Apa yang dianggap benar dalam pernyataan if di C?

Nilai apa pun yang bukan nol. Sintaks inti C tidak punya tipe boolean khusus, jadi if (n) berjalan saat n bernilai apa saja selain 0, dan if (!n) hanya berjalan saat n tepat 0. Operator perbandingan seperti == dan < menghasilkan 1 untuk benar dan 0 untuk salah.

Apa bedanya = dan == di C?

== membandingkan, = memberi nilai. Menulis if (x = 5) memberi nilai 5 ke x lalu menguji 5, yang bukan nol, sehingga cabangnya selalu berjalan. Kode ini bisa dikompilasi tanpa error, dan karena itulah ini bug pemula paling umum di kondisi C. Kebanyakan compiler memberi peringatan soal ini dengan -Wall.

Bagaimana cara kerja operator ternary di C?

condition ? valueIfTrue : valueIfFalse adalah ekspresi yang menghasilkan salah satu dari dua nilai, jadi bisa ditaruh di dalam penugasan atau argumen printf: int max = a > b ? a : b;. Pakai untuk memilih nilai, dan pakai if biasa saat kamu perlu menjalankan pernyataan.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai