在C语言中使用布尔值
关于C语言中的布尔值,我有一些想法:
我够老了,只使用普通的int
作为我的布尔类型,没有任何typedef、特殊定义或真/假值的枚举类型。如果你遵循下面建议中从不与布尔常量进行比较的方法,那么你只需要使用0/1来初始化标志位。然而,在这个现代化的时代,这种方法可能被认为是过时的。在这种情况下,应该至少使用
,因为它至少有一个标准化的好处。
无论布尔常量的名称是什么,只用它们进行初始化。永远不要写像这样的东西
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
的定义。