我们知道,C语言不像其他高级语言,它本身并没有定义boolean类型。它认为非0的值都为真,而只有0是假。也就是说C语言是通过判断整数值是否为0来进来逻辑控制的。
C99定义了_Bool类型来表示布尔。我们先来看一个关于_Bool类型的例子:
#include<stdio.h>
int main(void) {
_Bool a = -8;
_Bool b = 10L;
_Bool c = 0;
_Bool d = 0.0;
_Bool e = 121.45;
_Bool f = 'c';
_Bool g = "world";
_Bool h = '\0';
_Bool i = NULL;
printf("sizeof(_Bool) = %d\n", sizeof(_Bool));
printf("a->%d\n", a);
printf("b->%d\n", b);
printf("c->%d\n", c);
printf("d->%d\n", d);
printf("e->%d\n", e);
printf("f->%d\n", f);
printf("g->%d\n", g);
printf("h->%d\n", h);
printf("i->%d\n", i);
return 0;
}
输出结果:
sizeof(_Bool) = 1
a->1
b->1
c->0
d->0
e->1
f->1
g->1
h->0
i->0
从输出结果来看,gcc实现中,_Bool类型占一个字节大小,可以使用标量类型对_Bool变量赋值,但结果都会转化成0或者1,非0都转化成1。理所当然,空字符和空指针都转化成0。这种设计能够很好兼容以前的C版本。再来看一个例子:
#include<stdio.h>
int main(void) {
int true_val, false_val;
true_val = (10 > 2); //一个真值表达式的值
false_val = (10 == 2); //一个假值表达式的值
printf("true = %d\nfalse = %d\n", true_val, false_val);
return 0;
}
输出结果:
true = 1
false = 0
正如你所料,在C语言中,条件表达式的值只有0和1两个。实际上,只要是非0的表达式在C中都认为是真,只有值为0的表达式才为假。我们知道,在C语言中有各种表达式,这些表达式通常具有一个值。在进行真假判断的时候,系统首先将表达式的值转化为整型,再确定是否值为0。这个过程类似于_Bool类型变量赋值的过程。当然,只有标量类型可以进行此操作。什么是标量类型呢?根据C语言规范定义,只有整型,浮点数以及指针类型才是标量类型。
从这上面的分析可以理解到,if,while中的条件表达式的值必须是标量类型的。结构和数组这种复合类型是不允许出现在这里的。如果是函数调用,其返回值也必须是标量类型的。