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


当前回答

如果使用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;

其他回答

关于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定义的情况下理解它。

这就是:

#define TRUE 1
#define FALSE 0

如果使用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;

以下是我使用的版本:

typedef enum { false = 0, true = !false } bool;

因为false只有一个值,但逻辑true可以有多个值,但是技术将true设置为编译器将使用的与false相反的值。

这解决了某些人编码的问题,这些问题可以归结为:

if (true == !false)

我想我们都会同意,这不是一个好的做法,但为了一次性的“真=!假”,我们消除了这个问题。

[编辑]最后我使用了:

typedef enum { myfalse = 0, mytrue = !myfalse } mybool;

以避免与定义true和false的其他方案的名称冲突。但这一概念保持不变。

[EDIT]要显示整数到布尔值的转换:

mybool somebool;
int someint = 5;
somebool = !!someint;

第一个(最右边)!将非零整数转换为0,然后是第二个(最左边)!将0转换为myfalse值。我将把它作为练习留给读者来转换一个零整数。

[编辑]当需要特定值时,我的风格是在枚举中使用值的显式设置,即使默认值相同。示例:因为false需要为零,所以我使用false=0,而不是false,

[编辑]演示如何在使用gcc编译时限制枚举的大小:

typedef __attribute__((__packed__)) enum { myfalse = 0, mytrue = !myfalse } mybool;

也就是说,如果有人这样做:

struct mystruct {
    mybool somebool1;
    mybool somebool2;
    mybool somebool3;
    mybool somebool4;
}

结构的大小将是4字节而不是16字节。

您可以使用一个字符或另一个小数字容器。

伪码

#define TRUE  1
#define FALSE 0

char bValue = TRUE;