В C і деяких подібних мовах, порівнюючи логічні вирази для рівності false
або true
небезпечна звичка.
У C будь-який скалярний вираз (числовий або покажчик) може використовуватися в булевому контексті, наприклад, як умова if
твердження. Правило C таке, що if (cond)
еквівалентно if (cond != 0)
- тобто нуль є помилковим, а будь -яке ненульове значення - істинним. Якщо 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
є небезпечним, надмірно багатослівним та поганим стилем. У багатьох інших мовах подібні порівняння можуть не бути небезпечними, але вони все ще надмірно багатослівні та поганий.