Dalam bahasa C dan beberapa bahasa yang serupa, membandingkan ekspresi boolean untuk kesetaraan dengan falseatau truemerupakan kebiasaan berbahaya.
Dalam C, ekspresi skalar apa saja (angka atau penunjuk) dapat digunakan dalam konteks boolean, misalnya sebagai kondisi ifpernyataan. C aturan adalah bahwa if (cond)setara dengan if (cond != 0)- yaitu, nol adalah palsu, dan setiap nilai bukan nol benar. Jika condtipe pointer, 0diperlakukan 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 condtidak 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 intnilai, 0jika argumennya adalah digit, bukan nol jika bukan. Dapat kembali 42untuk menunjukkan bahwa kondisinya benar. Membandingkan 42 == trueakan gagal.
Kebetulan 0satu-satunya nilai yang dianggap salah, jadi perbandingan kesetaraan dengan falseakan 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 falseitu ok, dan membandingkan dengan trueitu tidak. Lebih buruk lagi, membandingkan dengan trueakan bekerja sebagian besar waktu (misalnya, operator kesetaraan dan relasional selalu menghasilkan salah satu 0atau 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, booltipenya sedikit lebih terintegrasi ke dalam bahasa, dan if (cond)mengkonversi conduntuk mengetik bool. Tetapi efeknya (kebanyakan) sama.
Beberapa bahasa lain memiliki apa yang orang sebut boolean berperilaku lebih baik, sehingga cond == truedan cond == false(atau apa pun sintaks yang terjadi) aman. Meski begitu, setiap bahasa yang saya lihat memiliki notatau !operator; itu ada di sana, jadi Anda sebaiknya menggunakannya. Menggunakan cond == falsedaripada !condatau not condtidak, 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 truedan falseberbahaya, 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.