C99新增的bool关键字
传统(指C90)C标准中是没有布尔类型的,对于C来说,非0即是真,而0即是假。
在C中,一直使用int类型表示真假值(布尔值),所以,任何条件表达式的结果要么是1(真),要么是0(假),在C99标准中,引入了新的类型_Bool,即布尔类型,布尔类型的变量只能存储1或0的整型值,把任何假值(整型和浮点的零值)赋值给_Bool,该变量会被设为0,否则被设为1,为此,C99还提供了stdbool.h头文件,该文件让bool成为_Bool的别名,同时宏定义了true和false,分别是1和0的字面量,这让写出的代码能与C++兼容,因为C++把true和false视作关键字。
需要注意:以上代码使用了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类型的函数。
原文链接:
https://www.cnblogs.com/ryzz/p/12325813.html
C99标准定义了一个新的关键字_Bool,提供了布尔类型。以前,C程序员总是使用自己的方法定义布尔类型。
0表示false,非0表示true。
可能使用char类型表示一个布尔类型,也可能使用int类型表示一个布尔类型。
很多函数库都定义了自己的布尔类型和相应的宏,枚举,typedef。
现在C99把C语言原生的布尔类型带来了。
#include<stdbool.h>
这个头文件定义了bool,true,false等宏。
#ifndef__cplusplus
如果不是C++,是纯C,那么,定义宏bool相当于_Bool类型。
#definebool_Bool
#definetrue 1
#definefalse 0
#else/* __cplusplus */
如果是C++,那么定义_Bool类型为bool类型。
/*Supporting <stdbool.h> in C++ is a GCC extension. */
#define_Bool bool
#definebool bool
#definefalse false
#definetrue true
#endif/* __cplusplus */
/*Signal that all the definitions are present. */
#define__bool_true_false_are_defined 1
看看上面这个宏是否==1,如果是,表示上面这些定义可用。
C2008草案中说:
Anobject declared as type_Boolis large enough to store the values 0 and1.
也就是说,只规定了_Bool类型的大小是至少能够存放0和1这两个值。并没有规定具体的大小。这交给编译器自由发挥了。
我用gcc做了一下测试:
printf("sizeof(bool):%d\n",sizeof(bool));
printf("sizeof(char):%d\n",sizeof(char));
printf("sizeof(int):%d\n",sizeof(int));
printf("sizeof(long):%d\n",sizeof(long));
–sizeof(bool):1
–sizeof(char):1
–sizeof(int):4
–sizeof(long):8
看来gcc是用char来实现_Bool类型的。
看看给_Bool类型赋值会怎样:
bool boolean=-11212112;
printf("boolean:%d\n",boolean);
–boolean:1
看来,gcc编译器对待_Bool类型有自己的转换处理。如果是0赋值给_Bool类型,那么就赋值0。如果是任意其他数据,那么会赋值为1!(只是不知道其他编译器是否如此处理,C2008标准草案没有细说这个部分)
以前一直用!逻辑非运算符:
if(!flag){
}
来表示0和非0。现在_Bool类型就只有0和1这两个值!
文章来源:
https://blog.csdn.net/u013256622/article/details/50925795