在C99之前,C
语言中并没有布尔类型
的关键字,C
语言中用0
表示逻辑假,非0
表示逻辑真, 程序员往往利用这一点自己实现布尔类型,实现的方式如下:
#ifndef BOOL_H
#define BOOL_H
typedef enum {
false,
true
} bool;
#endif
C99增加了一个新的关键字_Bool
,带来了语言级别的布尔类型
。 不过,这个_Bool
关键字太奇怪,并且为了兼容于C++
,C99同时提供了stdbool.h
头文件,定义了3
个宏
。
下面是glibc
中对stdbool.h
的实现:
#ifndef _STDBOOL_H
#define _STDBOOL_H
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#else /* __cplusplus */
/* Supportingin C++ is a GCC extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true
#endif /* __cplusplus */
/* Signal that all the definitions are present. */
#define __bool_true_false_are_defined 1
#endif /* stdbool.h */
实际上,就是定义了bool
、true
、false
这3
个宏
。 在预处理的时候替换掉真正的值。
C99只规定了_Bool
类型的大小是至少能够存放0
和1
这两个整数值。 并没有规定具体的大小。这交给编译器
自由发挥了。一般使用char
类型来实现。也可能会使用unsigned int
实现。
#include<stdbool.h>
int main() {
_Bool isXXX = false;
bool isYYY = true;
bool isZZZ = 0;
bool isVVV = 1;
bool isTTT = -12;
bool isNNN = 'A';
return 0;
}
使用cc命令预处理:
cc -E test.c
得到如下内容:
int main() {
_Bool isXXX = 0;
_Bool isYYY = 1;
_Bool isZZZ = 0;
_Bool isVVV = 1;
_Bool isTTT = -12;
_Bool isNNN = 'A';
return 0;
}
使用g++命令预处理:
g++ -E test.c
得到如下内容:
int main() {
bool isXXX = 0;
bool isYYY = 1;
bool isZZZ = 0;
bool isVVV = 1;
bool isTTT = -12;
bool isNNN = 'A';
return 0;
}
注意:
很多编译器
对待_Bool
类型有自己的转换处理。如果是0
赋值给_Bool
类型的变量,那么就赋值0
。 如果是任意其他数据,那么会赋值为1
,不知道是不是所有编译器
都这么处理的。因此,最好不要给_Bool
类型的变量赋给除了0
和1
之外的值。