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


当前回答

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

伪码

#define TRUE  1
#define FALSE 0

char bValue = TRUE;

其他回答

typedef enum {
    false = 0,
    true
} t_bool;

如果条件表达式为非零,则认为它们为真,但C标准要求逻辑运算符本身返回0或1。

@汤姆:#定义正确!FALSE是糟糕的,完全没有意义。如果头文件进入编译的C++代码,那么它可能会导致问题:

void foo(bool flag);

...

int flag = TRUE;
foo(flag);

某些编译器会生成关于int=>bool转换的警告。有时人们会通过以下方式避免这种情况:

foo(flag == TRUE);

以强制表达式为C++布尔值。但如果你#定义TRUE!如果为FALSE,则结果为:

foo(flag == !0);

它最终会进行int到bool的比较,这无论如何都会触发警告。

以下是我使用的版本:

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指令,如下所示:

#define TRUE 1
#define FALSE 0
#define NOT(arg) (arg == TRUE)? FALSE : TRUE
typedef int bool;

使用方法如下:

bool isVisible = FALSE;
bool isWorking = TRUE;
isVisible = NOT(isVisible);

等等

现在C99支持布尔类型,但需要#include<stdbool.h>。

例子:

#include <stdbool.h>

int main() 
{ 
    bool arr[2] = {true, false}; 

    printf("%d\n", arr[0] && arr[1]);
    printf("%d\n", arr[0] || arr[1]);

    return 0; 
} 

输出:

0
1