C没有任何内置布尔类型。在C语言中使用它们的最佳方式是什么?


当前回答

可以使用_Bool,但返回值必须是整数(1表示真,0表示假)。但是,建议在C++中包含和使用bool,如中所述这个来自daniweb论坛的回答,以及来自另一个stackoverflow问题的回答:

_布尔:C99的布尔类型。只有在维护已经为Bool、true或false定义宏的遗留代码时,才建议直接使用_Bool。否则,这些宏将在标题中标准化。包含该标头,您可以像在C++中一样使用bool。

其他回答

关于C中布尔值的几点思考:

我已经足够老了,我只使用纯int作为布尔类型,没有任何typedef或true/false值的特殊定义或枚举。如果你遵循我下面的建议,不要与布尔常量进行比较,那么你只需要使用0/1来初始化标志。然而,这种方法在现代可能被认为过于反动。在这种情况下,肯定应该使用<stdbool.h>,因为它至少有标准化的好处。

无论调用什么布尔常量,都只能用于初始化。永远不要写类似的东西

if (ready == TRUE) ...
while (empty == FALSE) ...

这些总是可以被更清晰的

if (ready) ...
while (!empty) ...

请注意,这些事实上可以合理且可以理解地大声读出。

给布尔变量取正名,即full而不是notfull。后者导致代码难以容易阅读。比较

if (full) ...
if (!full) ...

with

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);

or

#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }

无论哪种情况,呼叫站点现在看起来都是

foo(OPT_ON);
foo(OPT_OFF);

读者至少有机会在不理解foo定义的情况下理解它。

如果您使用的是C99编译器,它内置了对布尔类型的支持:

#include <stdbool.h>
int main()
{
  bool b = false;
  b = true;
}

http://en.wikipedia.org/wiki/Boolean_data_type

C有一个布尔类型:bool(至少在过去10(!)年)

包括stdbool.h和true/false将按预期工作。

如果使用C99,则可以使用_Bool类型。不需要#includes。不过,您确实需要将其视为整数,其中1为真,0为假。

然后可以定义TRUE和FALSE。

_Bool this_is_a_Boolean_var = 1;


//or using it with true and false
#define TRUE 1
#define FALSE 0
_Bool var = TRUE;

如果允许您使用C99,这只是对其他答案的补充和一些澄清。

+-------+----------------+-------------------------+--------------------+
|  Name | Characteristic | Dependence in stdbool.h |        Value       |
+-------+----------------+-------------------------+--------------------+
| _Bool |   Native type  |    Don't need header    |                    |
+-------+----------------+-------------------------+--------------------+
|  bool |      Macro     |           Yes           | Translate to _Bool |
+-------+----------------+-------------------------+--------------------+
|  true |      Macro     |           Yes           |   Translate to 1   |
+-------+----------------+-------------------------+--------------------+
| false |      Macro     |           Yes           |   Translate to 0   |
+-------+----------------+-------------------------+--------------------+

我的一些偏好:

_布尔还是布尔?两者都很好,但bool看起来比关键字_bool更好。bool和_bool的接受值为:false或true。指定0或1而不是false或true是有效的,但更难阅读和理解逻辑流。

标准中的一些信息:

_Bool不是无符号整数,而是无符号整数类型组的一部分。它足够大,可以保存值0或1。不要,但是的,你可以重新定义bool true和false,但肯定不是个好主意。这种能力被认为是过时的,将来将被删除。将标量类型(算术类型和指针类型)赋给_Bool或Bool,如果标量值等于0或与0比较,则为0,否则结果为1:_Bool x=9;当分配给x时,9被转换为1。_Bool是1字节(8位),通常程序员会尝试使用其他位,但不建议使用,因为唯一的保证是只使用一位来存储数据,而不是像具有8位可用的类型字符那样。