В 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опасны, слишком многословны и некачественны. Во многих других языках такие сравнения могут не быть опасными, но они все еще слишком многословны и некачественны.