В C и некоторых похожих языках сравнение логических выражений на равенство false
или true
является опасной привычкой.
В C любое скалярное выражение (числовое или указательное) может использоваться в логическом контексте, например, как условие if
оператора. Правило C - это то, что if (cond)
эквивалентно if (cond != 0)
- т. Е. Ноль равен false, а любое ненулевое значение - true. Если cond
имеет тип указателя, 0
обрабатывается как константа нулевого указателя; if (ptr)
значит if (ptr != NULL)
.
Это значит, что
if (cond)
а также
if (cond == true)
не означает то же самое . Первое верно, если cond
ненулевое; вторая верна, только если она равна true
, что в C (если у вас есть #include <stdbool.h>
) просто 1
.
Например, isdigit()
функция, объявленная в, <ctype.h>
возвращает int
значение, 0
если аргумент является цифрой, ненулевое, если это не так. Он может вернуться, 42
чтобы указать, что условие истинно. Сравнение 42 == true
не удастся.
Бывает, что 0
это единственное значение, которое считается ложным, поэтому сравнение на равенство false
будет работать; if (!cond)
и if (cond == false)
сделать то же самое. Но если вы собираетесь воспользоваться этим, вы должны помнить, что сравнивать с false
это нормально, а сравнивать true
- нет. Еще хуже то, что сравнение true
будет работать большую часть времени (например, операторы равенства и реляционные операции всегда дают либо 0
или 1
). Это означает, что любые ошибки, которые вы вносите с помощью этого, все еще могут быть трудно отследить. (Не волнуйтесь, они появятся, как только вы представите код важному клиенту.)
C ++ имеет немного другие правила; например, его bool
тип немного более тесно интегрирован в язык и if (cond)
преобразуется cond
в тип bool
. Но эффект (в основном) тот же.
Некоторые другие языки имеют то, что можно назвать булевыми значениями с лучшим поведением, так что cond == true
и cond == false
(или любой другой синтаксис) безопасен. Тем не менее, на каждом языке, который я видел, есть оператор not
или !
; это там, так что вы могли бы также использовать его. Использование, cond == false
а не !cond
или not cond
, на мой взгляд, не улучшает читаемость. (Это правда, что !
персонаж может быть трудно увидеть с первого взгляда; иногда я добавляю пробел после, !
чтобы избежать этого.)
И часто вы можете избежать проблемы и улучшить ясность, слегка переставив код. Например, а не:
if (!cond) {
do_this();
}
else {
do_that();
}
Вы могли бы написать:
if (cond) {
do_that();
}
else {
do_this();
}
Это не всегда лучше, но не мешает искать возможности там, где это есть.
Резюме: В C и C ++ сравнения на равенство true
и false
опасны, слишком многословны и некачественны. Во многих других языках такие сравнения могут не быть опасными, но они все еще слишком многословны и некачественны.