Dalam bahasa C dan beberapa bahasa yang serupa, membandingkan ekspresi boolean untuk kesetaraan dengan false
atau true
merupakan kebiasaan berbahaya.
Dalam C, ekspresi skalar apa saja (angka atau penunjuk) dapat digunakan dalam konteks boolean, misalnya sebagai kondisi if
pernyataan. C aturan adalah bahwa if (cond)
setara dengan if (cond != 0)
- yaitu, nol adalah palsu, dan setiap nilai bukan nol benar. Jika cond
tipe pointer, 0
diperlakukan sebagai konstanta pointer nol; if (ptr)
berarti if (ptr != NULL)
.
Ini artinya
if (cond)
dan
if (cond == true)
tidak berarti hal yang sama . Yang pertama benar jika cond
tidak nol; yang kedua adalah benar hanya jika itu sama dengan true
, yang di C (jika Anda punya #include <stdbool.h>
) sederhana 1
.
Misalnya, isdigit()
fungsi yang dideklarasikan dalam <ctype.h>
mengembalikan int
nilai, 0
jika argumennya adalah digit, bukan nol jika bukan. Dapat kembali 42
untuk menunjukkan bahwa kondisinya benar. Membandingkan 42 == true
akan gagal.
Kebetulan 0
satu-satunya nilai yang dianggap salah, jadi perbandingan kesetaraan dengan false
akan berhasil; if (!cond)
dan if (cond == false)
melakukan hal yang sama. Tetapi jika Anda akan mengambil keuntungan dari itu, Anda harus ingat bahwa membandingkan dengan false
itu ok, dan membandingkan dengan true
itu tidak. Lebih buruk lagi, membandingkan dengan true
akan bekerja sebagian besar waktu (misalnya, operator kesetaraan dan relasional selalu menghasilkan salah satu 0
atau 1
). Ini berarti bahwa setiap bug yang Anda perkenalkan dengan menggunakan ini masih sulit dilacak. (Jangan khawatir, mereka akan muncul segera setelah Anda demo kode ke klien penting.)
C ++ memiliki aturan yang sedikit berbeda; misalnya, bool
tipenya sedikit lebih terintegrasi ke dalam bahasa, dan if (cond)
mengkonversi cond
untuk mengetik bool
. Tetapi efeknya (kebanyakan) sama.
Beberapa bahasa lain memiliki apa yang orang sebut boolean berperilaku lebih baik, sehingga cond == true
dan cond == false
(atau apa pun sintaks yang terjadi) aman. Meski begitu, setiap bahasa yang saya lihat memiliki not
atau !
operator; itu ada di sana, jadi Anda sebaiknya menggunakannya. Menggunakan cond == false
daripada !cond
atau not cond
tidak, menurut saya, meningkatkan keterbacaan. (Memang benar bahwa !
karakter bisa sulit dilihat sekilas; Saya kadang-kadang menambahkan spasi setelah !
untuk menghindari ini.)
Dan seringkali Anda dapat menghindari masalah dan meningkatkan kejelasan dengan mengatur ulang kode sedikit. Misalnya, daripada:
if (!cond) {
do_this();
}
else {
do_that();
}
Anda mungkin menulis:
if (cond) {
do_that();
}
else {
do_this();
}
Itu tidak selalu lebih baik, tetapi tidak ada salahnya mencari peluang di tempat itu.
Ringkasan: Dalam C dan C ++, perbandingan kesetaraan dengan true
dan false
berbahaya, terlalu bertele-tele, dan gaya yang buruk. Dalam banyak bahasa lain, perbandingan seperti itu mungkin tidak berbahaya, tetapi masih terlalu bertele-tele dan gaya yang buruk.