【问题标题】:Why was the boolean data type not implemented in C为什么布尔数据类型没有在 C 中实现
【发布时间】:2014-09-22 12:59:30
【问题描述】:

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

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

我们可以以这种方式使用布尔值

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

或使用typedefs。

但我的问题是:为什么它没有在 C 中实现为数据类型,即使在这么多年之后。实现单字节数据类型来存储布尔值而不是显式使用intshort 是否有意义。

【问题讨论】:

  • 它就在那里。查找<stdbool.h>
  • 我查看了<stdbool.h>,但它使用整数作为返回类型。为什么整数,不会 4 个字节是多余的(考虑 sizeof(int) = 4),如果我们可以只使用 1 个字节来做到这一点
  • @ralph - sizeof(bool) 取决于实现,但如果您处于 C99 模式,sizeof(bool) 通常等于 1。我很久以前回答过一个类似的问题:stackoverflow.com/a/10630231/297696。出于兼容性原因,较旧的实现可能会保留sizeof(bool) == sizeof(int)(或其他)。
  • @mafso 示例 - bool b = (x & 0x8000); 。如果boolchar 的别名,那么即使设置了预期位,也会将其设置为false。对于以 bool 作为参数或返回 bool 的函数来说,这个问题更加隐蔽。

标签: c boolean


【解决方案1】:

这不再是真的了。内置布尔类型,又名_Bool,自C99 起可用。如果您包含stdbool.h,它的别名bool 也适合您。


_Bool 是真正的原生类型,而不是 int 的别名。至于它的大小,标准只规定它足够大以存储01。但在实践中,大多数编译器确实将其大小设为1

例如,这个code snippet on 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 个字节。
  • thanx.. 我现在明白了.. :)
  • 因为最小的可寻址内存元素大小是 1 字节,所以它们不能使它成为 1 位或小于 1 字节,除非它的地址不会被占用
【解决方案2】:

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

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

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

头文件定义了四个宏。

布尔

扩展为 _Bool。

其余三个宏适用于#if 预处理指令。他们 是

是的

展开成整数常数1,

展开成整数常量0,并且

__bool_true_false_are_defined

展开为整数常量 1。

【讨论】:

  • 我知道了。但我再次想到的是为什么它会返回整数。数据类型 _Bool 可能有自己的原生类型,只占用 1 个字节。
【解决方案3】:

由于数据类型是预定义的,我们不能使用“bool”数据类型,因为它没有出现在文档中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 2020-07-07
    • 2011-02-04
    • 2011-05-30
    • 2011-01-24
    • 1970-01-01
    • 2012-10-25
    • 2023-03-26
    相关资源
    最近更新 更多