为什么C语言没有实现布尔数据类型?

10

我的一个朋友问了一个问题,为什么C编程语言中没有Boolean数据类型。我做了一些搜索和阅读。在stackoverflow上找到了一些问题和答案,其中有几个回答如下:

  1. 所有的数据类型都应该是可寻址的,而一个位是不能被寻址的。
  2. 主流CPU的基本数据结构是字节。在这些CPU上操作位需要额外的处理。

我们可以用bool来代替。

#define bool int
#define TRUE 1
#define FALSE 0

或者使用 typedef

但我的问题是:即使经过这么多年,为什么它没有在C语言中作为数据类型实现。使用一个字节的数据类型来存储布尔值是否比显式地使用 intshort 更合理呢?


7
在那里,查看<stdbool.h> - P.P
相关链接:https://dev59.com/PXI-5IYBdhLWcg3w8NOB#1608350 - P.P
7
在C语言中,sizeof(bool)的大小取决于具体实现。但如���你使用C99标准,通常sizeof(bool)等于1。我曾经在很久以前回答过类似的问题:https://dev59.com/Zmgv5IYBdhLWcg3wY_82#10630231。为了保持兼容性,旧的实现可能会将`sizeof(bool)`设置为`sizeof(int)`或其他��。 - wkl
只是提醒一下,布尔类型真的有用吗?布尔变量(或返回它们的函数)通常具有相当描述性的名称:isValidhasAttributeneedsFree等等。而且(正如其他人所说,在C中一个位不可寻址),没有任何性能收益可以证明这种事情是合理的。C语言被设计得非常简洁(今天稍微好一些,但仍然如此)。 - mafso
2
示例:bool b = (x & 0x8000);。如果 boolchar 的别名,则即使设置了预期的位,它也会将其设置为 false。对于以 bool 作为参数或返回值的函数,这个问题更加隐蔽。 - M.M
显示剩余8条评论
3个回答

20

这不再是真的了。自C99以来,内置布尔类型,即_Bool已经可用。如果您包含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;
}

我明白了。但是我脑海中浮现的问题是,为什么它会返回整数。_Bool 数据类型本可以有自己的本地类型,只占用 1 字节。 - Haris
谢谢,我现在明白了 :) - Haris
因为最小可寻址内存元素大小为1字节,所以它们无法将其设置为1位或小于1字节,除非不会取地址。 - phuclv

5
C99增加了对布尔类型 _Bool 的支持,它不仅仅是一个 typedef,并且不必与 int 大小相同。这在 C99 标准的 6.2.5 节“类型”中有说明:
“声明为 _Bool 类型的对象足够大,可以存储值 0 和 1。”
我们可以通过 stdbool.h 头文件中的便利宏来使用。这可以从 C99 标准草案的 7.16 节“布尔类型和值”中看到:
“头文件定义了四个宏。”

bool
扩展为 _Bool。
其余三个宏适用于 #if 预处理指令。它们是
true 宏,它扩展为整数常量 1,
false 宏,它扩展为整数常量 0,以及
__bool_true_false_are_defined
宏,它扩展为整数常量 1。

我明白了。但是我脑海中浮现的问题是,为什么它会返回整数。_Bool 数据类型本可以有自己的本地类型,只占用 1 字节。 - Haris

-1

由于数据类型是预定义的,因此我们无法使用“bool”数据类型,因为它在文档中不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接