为什么布尔数据类型没有在C中实现

Har*_*ris 9 c boolean

我的一个朋友问了一个问题,为什么BooleanC编程语言中没有数据类型.我做了一些搜索和阅读.我在堆栈溢出中得到的问题和答案很少说,

  1. 所有数据类型都应该是可寻址的,并且无法解决一些问题.
  2. 主流CPU硬件级别的基本数据结构是一个字节.对这些CPU中的位进行操作需要额外的处理.

我们可以用这种方式使用bool

#define bool int
#define TRUE 1
#define FALSE 0
Run Code Online (Sandbox Code Playgroud)

或使用typedefs.

但我的问题是:即使经过这么多年,为什么它不是作为C中的数据类型实现的.实现一个字节数据类型来存储布尔值而不是使用intshort显式是没有意义的.

Yu *_*Hao 18

那不再是真的了.内置的布尔类型,也_Bool就是自C99以来可用.如果你包括stdbool.h,它的别名bool也适合你.


_Bool是一个真正的本机类型,而不是别名int.至于它的大小,标准只规定它足够大,可以存储01.但在实践中,大多数编译器都会确定其大小1:

例如,ideone上的代码段输出1:

#include <stdio.h>
#include <stdbool.h>
int main(void) {
    bool b = true;
    printf("size of b: %zu\n", sizeof(b));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*our 5

C99 添加了对 boolean 类型的支持_Bool,它不仅仅是一个 typedef,也不必与int大小相同,来自 C99 标准草案6.2.5 Types

声明为 _Bool 类型的对象足够大,可以存储值 0 和 1。

我们通过stdbool.h标题有方便的宏。我们可以从 C99 标准草案7.16 布尔类型和值中看到这一点,其中说:

标头定义了四个宏。

宏观

布尔值

扩展为 _Bool。

其余三个宏适合在 #if 预处理指令中使用。他们是

真的

扩展到整数常量 1,

错误的

它扩展到整数常量 0,并且

__bool_true_false_are_已定义

它扩展到整数常量 1。