C语言布尔类型(bool)的用法

 
在一些场景中,变量的取值只存在两种情况。比如用变量 sex 表示人的性别,它的值只有‘男’和‘女’,不存在其它的可能。

通过前面的学习,读者已经掌握了很多种数据类型,比如 char、short、int、long、float、double 等。那么,对于只有两种取值的变量,它的类型应该是什么呢?

在 C99 标准发布之前,对于只有两种取值的变量,没有完全适配的数据类型。退而求其次,通常选择 int 作为变量的类型。

int 类型的取值范围是[-2147483648, 2147483647],将这些值分为 0 和非 0 数两大类,就可以模拟出“变量只有两种取值”的情况。例如,用 int 类型的变量 sex 表示人的性别,sex 的值为 0 时表示女性;sex 的值为非 0 数时表示男性。

为了解决这个历史遗留问题,C99 标准新引入了 _Bool 类型,中文叫做布尔类型。

布尔类型定义的变量,只能存储 0 或者 1,如果赋值其它的非 0 数,那么变量的值会被设定为 1。例如:
#include <stdio.h>

int main()
{
    _Bool sex = 0;
    _Bool sex1 = 1;
    _Bool sex2 = 1234;
    printf("sex = %d\n", sex);
    printf("sex1 = %d\n", sex1);
    printf("sex2 = %d\n", sex2);
    return 0;
}
执行结果为:

sex = 0
sex1 = 1
sex2 = 1

printf() 输出 bool 类型的值,格式控制符用 %d 或者 %hd 都可以,它们都能容纳得下 _Bool 类型的两个值(0 和 1)。

_Bool 类型的长度和 char 相同,只占用 1 个字节。大家也可以用 sizeof 操作符查看 _Bool 类型的长度:
#include <stdio.h>
int main()
{
    printf("%ld", sizeof(_Bool));
    return 0;
}
执行结果为:

1

C99 bool类型

布尔类型(_Bool)以下划线_开头,首字母还要大写,这和我们之前掌握的类型(char、float、int、float)相比,写法上有较大的出路,初学者多少会觉得别扭。

其实除了C语言,很多编程语言都提供了布尔类型,比如 C++JavaC# 等,它们中的绝大部分都采用“bool”作为布尔类型的名称,并且布尔类型的两种取值分别用“假(false)”和“真(true)”表示,false 代指 0,true 代指 1。

或许是受其它编程语言的影响,又或许是考虑到初学者的感受,C语言标准委员会决定引入 _Bool 类型的同时,添加 bool 作为 _Bool 类型的别名,并且布尔类型的取值可以用 true 和 false 表示。

也就是说在C语言程序中,布尔类型可以用 _Bool 表示,也可以用 bool 表示。

需要注意的点,使用 bool 类型之前,必须先引入<stdbool.h>头文件。例如:
#include <stdio.h>
#include <stdbool.h>   // bool、true、false

int main()
{
    bool sex = true;
    printf("%d", sex);
    return 0;
}
执行结果为:

1

总结

对于仅有两个值的变量,C99 标准建议将变量的类型设定为布尔类型,可以用 _Bool 或者 bool 表示。如果编译器不支持布尔类型,退而求其次,通常选用 int 类型。

在 C99 标准中,想用 bool 表示布尔类型,想用 true 和 false 表示布尔类型的两种取值,必须先引入<stdbool.h>头文件。