4.6 鸡肋——_Bool类型(C99)
逻辑非!运算、关系(>、>=、<、<=)运算、判等(==、!=)运算、逻辑与&&运算以及逻辑或||运算的结果只有两种可能:int类型的0或int类型的t。C99特为这种数据增添了一种新的类型:_Bool类型。
这种类型的名字与以往的惯例不同,首次在关键字中出现了大写的字母,其次以下划线开头。这样,喜欢以下划线开头方式做标识符的方式立刻遭受到了一种无形的桎梏,以大写字母开头做标识符也是。尽管C语言没有这些限制,但这个关键字却无言地作出了隐隐约约的限制。
这种类型只表示两个值,C语言没明确其字节空间应该是多少,只说够放0或1就可以了。本质上,_Bool类型是一种unsigned整数类型。
和char等类型一样,这种类型的量在参与运算之前被编译器转换成了int类型的值。所以显然,这种类型能够通过调用printf()函数使用%d这种格式输出。输入?我不知道,C99也没说。
其他类型的值在转换成_Bool类型时,非0值被转换成_Bool类型量1。
在没有这种类型的年代里,C语言用int类型工作的很好。这种新类型的引进,除了在某些情况下使代码的逻辑意义更为清晰明显之外,看不出还有什么重大意义,很有些鸡肋的味道。
或许,可以把程序代码4-1写成下面的样子。
程序代码4-6
更好些么?还是半斤八两?
有一些人不喜欢使用_Bool这个不像关键字的关键字,他们更倾心于使用bool这样的关键字(虽然bool不是关键字);而且他们耻于在代码中用0、1这样赤裸裸的“常量”(!)来谈论“是”、“非”问题,他们觉得用false或true这样的文字更好些,代码会更顺眼。C99满足这种合理要求,只要在代码开头加上#include<stdbool.h>就可以了。在stdbool.h中规定了bool等价于_Bool,且定义了两个值分别为0和1的符号常量false与true。
程序代码4-7
感觉如何?好像还是换汤不换药吧。本书后面的代码不再涉及到这种类型。