Несколько мыслей о логических значениях в C:
Я достаточно взрослый, чтобы просто использовать обычные int
s в качестве моего логического типа без каких-либо определений типов, специальных определений или перечислений для значений true / false. Если вы последуете моему предложению никогда не сравнивать с булевыми константами, тогда вам все равно нужно будет использовать 0/1 для инициализации флагов. Однако такой подход может считаться слишком реакционным в эти современные времена. В этом случае, безусловно, следует использовать <stdbool.h>
, поскольку оно, по крайней мере, имеет преимущество от стандартизации.
Как бы не назывались булевы константы, используйте их только для инициализации. Никогда не пиши что-то вроде
if (ready == TRUE) ...
while (empty == FALSE) ...
Они всегда могут быть заменены на более ясные
if (ready) ...
while (!empty) ...
Обратите внимание, что на самом деле их можно разумно и понятно прочитать вслух.
Дайте вашим логическим переменным положительные имена, то есть full
вместо notfull
. Последнее приводит к коду, который трудно прочитать легко. Сравнить
if (full) ...
if (!full) ...
с
if (!notfull) ...
if (notfull) ...
Обе первые пары читают естественным образом, в то время как !notfull
неудобно читать даже в том виде, как оно есть, и становится намного хуже в более сложных логических выражениях.
Булевы аргументы обычно следует избегать. Рассмотрим функцию, определенную следующим образом
void foo(bool option) { ... }
В теле функции очень ясно, что означает аргумент, поскольку он имеет удобное и, мы надеемся, содержательное имя. Но сайты вызовов выглядят как
foo(TRUE);
foo(FALSE):
Здесь, по сути, невозможно сказать, что имел в виду параметр, не всегда просматривая определение или объявление функции, и становится намного хуже, как только вы добавляете еще больше логических параметров. Я предлагаю либо
typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);
или
#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }
В любом случае сайт вызова теперь выглядит как
foo(OPT_ON);
foo(OPT_OFF);
, который читатель, по крайней мере, имеет шанс понять, не углубляясь в определение foo
.