学习和使用了几年C/C++, 对其中的某些细节一直都是认识的模模糊糊,尽管能在写代码时正确实现功能,但难免有时犯嘀咕:这样用会不会有问题?
C/C++中的"Boolean Data“类型就是我一直觉得很模糊的部分。
由于C语言的设计理念之一就是灵活,所以我在学习的时候,在布尔表达式这个问题上,也就采取了灵活的理解方式:”甭管输入的数据是什么类型,只有在值为0时才表示false,其他值均表示true。“
这样的结果就是我对true/false,TRUE/FALSE,bool/BOOL这些概念的理解一直处于一种一知半解,经常混淆的状态。
最近在看《The Art and Science of C》,决定利用这个机会,将类似的细节问题搞个清楚。
首先是C
在C99标准之前,C中是不存在布尔类型的,通常是用int来当作布尔类型使用,但是一般不少人又觉得不够清晰,因此产生了五花八门的自定义布尔类型。
C99中引入了标准的布尔类型"_Bool",其标准如下:
“ 类型的名字为_Bool,值域为0和1。
_Bool类型不能用signed, unsigned, short, long等修饰。“
标准没有规定_Bool类型占用的大小。不过由于多数C编译器是和C++编译器一块供应
的,因此在实现了C99的编译器上,_Bool类型的大小跟C++编译器的bool一样。
之所以用_Bool这个怪异的名字,是因为怕和以前用户已经定义自己的布尔类型的源代码
冲突。
然而,_Bool这个符号实在难看又不好记,因此标准又规定了一个标准头文件<stdbool.h>
,对其规定如下:
“ 要定义一个bool宏,展开后为_Bool
要定义一个true宏,展开后为1
要定义一个false宏,展开后为0
要定义一个宏常量,名字叫__bool_true_false_are_defined,值为1,方便程序中用条件预处理检测之。“
因此,只要包含该头文件,用户就可以在程序中用bool来声明布尔类型数据,并使用true/或false为其赋值。
注意:C语言中的关键字中从未包含true 和false。
然后是C++
C++一开始也没有bool类型,后来引入了bool类型。
bool类型不能用signed, unsigned, short, long等修饰。
bool类型的值只能为false和true,bool值作整数运算的时候,false转为0,true转为1。任何其他类型转为bool的时候,零转为false,非零转为true。
布尔类型的引入给C和C++的逻辑运算带来了变化,在引入布尔类型之前,C和C++的逻辑运算的结果为整形,if,while等条件语句的条件也是整形;引入布尔类型之后都变成了布尔类型。
C/C++中的"Boolean Data“类型就是我一直觉得很模糊的部分。
由于C语言的设计理念之一就是灵活,所以我在学习的时候,在布尔表达式这个问题上,也就采取了灵活的理解方式:”甭管输入的数据是什么类型,只有在值为0时才表示false,其他值均表示true。“
这样的结果就是我对true/false,TRUE/FALSE,bool/BOOL这些概念的理解一直处于一种一知半解,经常混淆的状态。
最近在看《The Art and Science of C》,决定利用这个机会,将类似的细节问题搞个清楚。
首先是C
在C99标准之前,C中是不存在布尔类型的,通常是用int来当作布尔类型使用,但是一般不少人又觉得不够清晰,因此产生了五花八门的自定义布尔类型。
C99中引入了标准的布尔类型"_Bool",其标准如下:
“ 类型的名字为_Bool,值域为0和1。
_Bool类型不能用signed, unsigned, short, long等修饰。“
标准没有规定_Bool类型占用的大小。不过由于多数C编译器是和C++编译器一块供应
的,因此在实现了C99的编译器上,_Bool类型的大小跟C++编译器的bool一样。
之所以用_Bool这个怪异的名字,是因为怕和以前用户已经定义自己的布尔类型的源代码
冲突。
然而,_Bool这个符号实在难看又不好记,因此标准又规定了一个标准头文件<stdbool.h>
,对其规定如下:
“ 要定义一个bool宏,展开后为_Bool
要定义一个true宏,展开后为1
要定义一个false宏,展开后为0
要定义一个宏常量,名字叫__bool_true_false_are_defined,值为1,方便程序中用条件预处理检测之。“
因此,只要包含该头文件,用户就可以在程序中用bool来声明布尔类型数据,并使用true/或false为其赋值。
注意:C语言中的关键字中从未包含true 和false。
然后是C++
C++一开始也没有bool类型,后来引入了bool类型。
bool类型不能用signed, unsigned, short, long等修饰。
bool类型的值只能为false和true,bool值作整数运算的时候,false转为0,true转为1。任何其他类型转为bool的时候,零转为false,非零转为true。
布尔类型的引入给C和C++的逻辑运算带来了变化,在引入布尔类型之前,C和C++的逻辑运算的结果为整形,if,while等条件语句的条件也是整形;引入布尔类型之后都变成了布尔类型。