一、简介
1. 布尔一词的由来
在科学领域,很多专业术语的命名都是以科学家的名字来命名的,布尔也不例外。
乔治·布尔(George Boole,1815.11.2~1864),1815年11月2日生于英格兰的林肯。19世纪最重要的数学家之一,出版了《逻辑的数学分析》 ,这是它对符号逻辑诸多贡献中的第一次。1854年,他出版了《思维规律的研究》,这是他最著名的著作。在这本书中布尔介绍了现在以他的名字命名的布尔代数。
2. 布尔型
布尔(Boolean)是计算机科学领域中的一种逻辑数据类型,顾名思义,用于逻辑运算。该数据类型只有两个可能的值,true 和 false,数字化的表示可以分别对应 1 和 0。在 C 语言中,通常情况下将 0 抽象地表示成 假(false),而 非0 则抽象地表示成(true)。在某些情况下我们会将 int 类型当做布尔型使用,以数字 1 代表真,以数字 0 代表假。
二、使用
注意:使用布尔型定义需要头文件 stdbool.h,本头文件在 C99 标准中引入。
1. 内存占用
从理论上讲,布尔型数据只有 1 和 0 两种可能,所以占用应该是 1 bit 也就是 1/8 个字节,但是实际在 C 语言中的占用达到了 1 个字节,与 char 类型一致。如下:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
printf("bool 型的占用大小为 %llu\n", sizeof(bool));
printf("char 型的占用大小为 %llu\n", sizeof(char));
}
输出结果:
bool 型的占用大小为 1
char 型的占用大小为 1
注:格式说明符 %llu 对应的数据类型为 unsigned long long,即 sizeof 函数返回值类型
综上,bool 型在空间占用上比 int 更小,与 char 相比使用起来会更加严谨。
2. 赋值
常规定义与赋值
#include <stdbool.h>
int main(void)
{
bool status_true = true; /* 实际存储的值为 1 */
bool status_false = false; /* 实际存储的值为 0 */
}
数值赋值
与 C 语言传统一致,非0 代表 true,而 0 则代表 false。
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool a = -8, b = 0, c = 6;
printf("a = %d, b = %d, c = %d", a, b, c);
}
输出结果:
a = 1, b = 0, c = 1
由此可见,变量 a 的值为 true,变量 b 的值为 false,变量 c 的值为 true。
3. 函数定义
某些判断函数也可以直接使用 bool 型进行定义,如下判断非负整数中的素数:
#include <stdbool.h>
#include <math.h>
bool isPrime(unsigned int n)
{
bool isTrue = true;
if (n == 0 || n == 1) isTrue = false;
if (n > 3)
{
unsigned int limit = (unsigned int)sqrt(n) + 1;
for (unsigned int i = 2; i <= limit ; i++)
{
if (!(n % i))
{
isTrue = false;
break;
}
}
}
return isTrue;
}
返回值可直接用于如 if 语句的这类语句进行判断。
三、附录
1. stdbool.h 的内容
在 Visual Studio 2019 中该文件的定义如下,仅做参考:
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// The C Standard Library <stdbool.h> header.
//
#ifndef _STDBOOL
#define _STDBOOL
#define __bool_true_false_are_defined 1
#ifndef __cplusplus
#define bool _Bool
#define false 0
#define true 1
#endif /* __cplusplus */
#endif /* _STDBOOL */
2. bool 型自定义方式
以下列出几种可能的方式供参考,主要在不支持 C99 标准的编译器中使用。
① 枚举 enum
typedef enum { false, true }bool;
② 宏定义 #define
#define bool int
#define true 1
#define false 0
③ 类型自定义 typedef + 不变变量(常量) const
typedef int bool;
const bool true = 1;
const bool false = 0;
注意:本文前两部分的部分内容仅在支持 C99 标准及以上的编译器中可运行。
以上。