起初,C语言并没有布尔类型,都是使用int类型的变量来表示布尔值(时至今日大家也基本都这样弄)。_Bool是C99标准(1999年的标准)新增的数据类型,用于表示布尔值(即逻辑值true和false)的数据类型。
那么C语言设计之初为什么没有bool类型,而后来又怎么搞出个_Bool来呢?
这就得说说C语言的设计理念了。
一、设计初心:简洁性
C语言的设计初衷是提供一种简洁、高效的编程语言。bool型能干的int全都能干,多搞出个数据类型有什么意义呢?于是,为了保持语言的简洁性,并未引入布尔类型。
二、引入原因:可读性需求
斗转星移,越来越多的C程序员看着别的编程语言风骚地使用着bool、true、false直流口水,人们普遍认为有这三位英雄罩着能提高代码的可读性。
没啥要啥,缺啥想啥。饥渴难耐的程序员们该怎么办呢?
没有枪,没有炮,自己给自己造。
万能的“宏”啊,请赐予我bool吧!
#define bool int
#define true 1
#define false 0
后来官方也做出响应,在C99标准增设了布尔类型。只是这个布尔类型不是像bool、BOOL这样的美男子,而是这样一个怪胎:_Bool。
为什么要起这个不招待见的名呢?
很大的可能是要避免与程序员前面的自制版bool产生冲突。
假设将布尔类型命名为bool,那么遇到以前的自制版bool,会产生什么化学反应呢?
因为#define bool int的存在,在编译时会自动将所有的bool替换为int,相当于这个新设的bool类型完全没起作用。用下面的代码可以验证这一点。
#include <stdio.h>
#define bool int
int main()
{printf("%d %d\n", sizeof(_Bool), sizeof(bool));return 0;
}
结果输出:1 4
正常布尔类型只占1个字节(这其实也是bool类型的一个存在价值,占用内存比int型小),但因为bool被替换为int,所以sizeof(bool)输出的是4个字节。
对这个其貌不扬的孩子,人人见了都倒胃口,实在没人愿意用。官方又想了个折衷的办法,就是把民间办法官方化,建了一个标准库 <stdbool.h>。在这个头文件中是这样的熟悉配方:
#define bool _Bool
#define true 1
#define false 0
从此以后,我们不用自己造炮了,只要加上<stdbool.h>头文件,就可以像其他语言一样使用bool、true、false。
可是,毕竟还要加上<stdbool.h>这个头文件,多少还是让人有些不爽。
官方于是在2023年终于给出了终极配方。
三、内置bool类型
在C23标准中,增加bool、true、false三个关键字,正式把bool作为布尔类型。这一天意味着三傻正式进军宝莱坞。
只是这个标准目前很多编译器还不支持,老金实际测试自己的编译器就不行。
#include<stdio.h>
int main(){bool b = true;printf("%d\n", b);return 0;
}