对C99新增的_Bool类型的理解

传统(指C90)C标准中是没有布尔类型的,对于C来说,非0即是真,而0即是假,这里0不仅包括整型家族的0,还包括浮点家族的0.0,有如下代码,

1 if (0.0){
2         puts("true");
3 }else{
4         puts("false");
5 }

输出的结果是:false

在C中,一直使用int类型表示真假值(布尔值),所以,任何条件表达式的结果要么是1(真),要么是0(假),在C99标准中,引入了新的类型_Bool,即布尔类型,布尔类型的变量只能存储1或0的整型值,把任何假值(整型和浮点的零值)赋值给_Bool,该变量会被设为0,否则被设为1,为此,C99还提供了stdbool.h头文件,该文件让bool成为_Bool的别名,同时宏定义了true和false,分别是1和0的字面量,这让写出的代码能与C++兼容,因为C++把true和false视作关键字,下面对_Bool类型的一些测试代码,

 1 #include <stdio.h>
 2 #include <stdbool.h>
 3 
 4 int main(){
 5     _Bool flag=true;
 6     printf("sizeof flag = %d\n",sizeof flag);
 7     printf("type of flag is %s\n",_Generic(flag,int:"int",_Bool:"_Bool",default:"default"));
 8     printf("the conditional expression of C language is %s\n",_Generic(2>3,int:"int",_Bool:"_Bool",default:"default"));
 9     printf("the conditional expression of C language is %s\n",_Generic(flag==false,int:"int",_Bool:"_Bool",default:"default"));
10     return 0;
11 }

输出结果:

sizeof flag = 1
type of flag is _Bool
the conditional expression of C language is int
the conditional expression of C language is int

需要注意:以上代码使用了C11的泛型表达式_Generic(简单地说,它接受若干参数,第一个参数必须是一个符合C语言的表达式,然后会根据提供的这个表达式的类型去匹配后面给出的类型,最后,整个_Generic表达式的值就是匹配成功项冒号后面的值),所以需要对编译器开启-std=c11标记。

分析输出的3行结果的含义:

1.这说明了_Bool类型占用1字节,对于布尔类型,理论上只需要占1bit的空间就足够了,但是大多数的编译器在实际实现上都采用1字节,因为在现在的计算机内存性能下没必要减少那7bit的空间

2.很明显,flag的类型就是_Bool

3.这点就很重要了!上面也提及过,在C语言中,一直只用int类型作为条件表达式的值,条件是真则表达式值就是1,条件是假则表达式值就是0

4.验证了上面的第3点,即便是_Bool类型的变量在做逻辑运算时,返回的结果还是int类型

所以,_Bool并没有改变C的规则,对于所有的条件表达式仍然以1表示真,以0表示假,它的加入,只是使得让编写人员有一种更直观的类型去保存那些期望是布尔值的变量。

您应该这样使用_Bool类型:对_Bool类型的赋值应该用条件表达式的值或返回类型是_Bool类型的函数。

个人观点,新的_Bool可以理解为只能保存0或1的unsigned char类型,。

(上文是本人对C99标准新类型_Bool的理解,错误或不严谨之处恳请指出。)

猜你喜欢

转载自www.cnblogs.com/ryzz/p/12325813.html