如何在C语言中使用布尔数据类型?

48

我刚刚在写C代码时发现,它没有布尔/bool数据类型。是否有任何可以包含的C库,以便让我能够返回布尔/bool数据类型?


4
通常使用普通的“int”类型,假设0为“false”,而任何其他值则为“true”。 - Rooke
可能是Is bool a native C type?的重复问题。 - Jim Fell
7个回答

75

如果您有支持C99的编译器,您可以

#include <stdbool.h>
否则,您可以定义自己的函数(如果需要)。根据您想如何使用它以及是否希望将代码编译为C ++,您的实现可能非常简单,例如:
#define bool int
#define true 1
#define false 0

在我看来,你可以直接使用int,将0表示为假,将非零值表示为真。这通常是在C语言中的做法。


@James,它起作用了。但我应该返回什么?我的意思是0还是false? - itsaboutcode
1
@ysap:我选择宏是因为它更接近于C99的做法(在C99中,truefalse都是被替换为10的宏,而bool是一个扩展为布尔类型 _Bool 的宏)。 - James McNellis
3
如果你为 booltruefalse 宏定义了,那么将返回类型定义为 bool 并返回 false。否则,将返回类型定义为 int 并返回 0。做什么由你决定。我认为非宏定义的方法更好。 - James McNellis
@James - 抱歉,我在编辑时搞砸了这个评论,把它删除了,所以我重新发布了它作为答案。你回复得太快了... - ysap
1
我实际上更喜欢在C语言中使用0表示false,非零表示true,而不需要特定的类型。在其他情况下,如果调用可能失败,则0表示成功,NZ表示错误代码(通常为负数代码)。 - caveman

18

C99有一个布尔数据类型,但如果您必须使用旧版本,则只需定义一个类型:

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

8
如果你问我,“模拟”C99之前的bool类型是危险的,因为语义不同。(bool)2的结果是2,而不是1。一个更现实的例子:在大多数实现中,1U<<(bool)isdigit(c)将给出错误的结果。 - R.. GitHub STOP HELPING ICE

5
C99有一个bool类型,要使用它,需要:
#include <stdbool.h>

1
James McNellis的答案已经说明了如何做到这一点。 - Uyghur Lives Matter

1
作为 James McNellis 答案的替代方案,我总是尝试使用枚举来代替宏定义 bool 类型:typedef enum bool {false=0; true=1;} bool;。这样更安全,因为它让编译器进行类型检查并消除了宏展开竞争。

这并不妨碍你说 bool b = 1; - James McNellis
据我所知,使用“#define bool int”与其他类型检查相比并没有额外的类型检查。 - James McNellis
哦,我想我明白你的意思了。然而,你在谈论变量声明,而我则涉及到true和false标记的实际使用。 - ysap
虽然确实很困难,但这只是一个例子:float f; f = true; 应该会因为隐式(并且可能不兼容)类型转换而引发警告。 - ysap
@Paul - 我很好奇 - 你确定这是个问题吗?如果我的记忆没错的话,那么枚举类型会被视为整型。不是这样吗?如果你是对的,那么这绝对是一个好的反例。 - ysap
显示剩余2条评论

0
C99 引入了 _Bool 作为纯粹的布尔类型。无需任何 #include 即可使用:
int main(void)
{
  _Bool b = 1;
  b = 0;
}

在一个真正符合C99(或更高版本)标准的C编译器上,上述代码应该可以完美地编译。

0
我们可以使用枚举类型来实现这个功能,不需要引入任何库。例如:
           enum {false,true};

false 的值为 0,true 的值为 1。


-3
struct Bool {
    int true;
    int false;
}

int main() {

    /* bool is a variable of data type – bool*/
    struct Bool bool;

    /*below I’m accessing struct members through variable –bool*/ 
    bool = {1,0};
    print("Student Name is: %s", bool.true);
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接