【问题标题】:Why are C booleans called _Bool?为什么 C 布尔值称为 _Bool?
【发布时间】:2017-12-14 20:54:21
【问题描述】:

为什么 C 使用单词_Bool 来定义布尔值?而他们使用 float 这个词来表示浮点数而不是 _Float

此外,为什么必须包含bool,为什么不是基本功能的一部分,例如float

【问题讨论】:

  • 这些对学生来说都是非常好的问题。如果有人拒绝他们,请不要气馁。
  • 这个问题的很大一部分是为什么类型被命名为_Bool;一个高质量的答案应该描述可能在现有代码中使用的名称可能发生的问题,以及使用保留标识符如何有助于避免该问题。
  • 重新打开。问题是为什么_Bool 如此命名;不是关于“_Bool 是什么”
  • 在我看来,我不明白为什么委员会希望这种微不足道的事情向后兼容。总是包含stdbool.h 很无聊。
  • @Stargateur 如果您必须使用已经设置为使用 bool 作为 C89 类型的 typedef 的大型代码库,您会理解它

标签: c


【解决方案1】:

_Bool 最初不是在 C 中,而是在 1999 年的 C 标准中添加的。如果它被称为bool,那么大量现有代码将会中断,因为许多项目已经创建了自己的类型别名bool

C89 标准预留了以_ 开头的标识符,后跟大写字符,保留供实现使用。这就是为什么添加到 C 中的新特性总是以这样的名称开头的原因。 _Complex_Alignof_Static_assert 是其他示例。

还有一个标题 <stdbool.h>bool 别名为 _Bool 并定义 truefalse ;新项目或尚未定义 bool 的项目可以包含此标头。

【讨论】:

    【解决方案2】:

    C 最初没有布尔类型,它是在 1999 年版本的语言 (C99) 中添加的。那时,C++ 已经标准化(在 1998 年)使用bool 类型,关键字falsetrue。为了将 C 布尔类型与 C++ 中的布尔类型分开,并防止新名称破坏旧的 C 代码,将其命名为 _Bool

    之所以用下划线后跟一个大写字母命名,是因为 7.1.3 已经保证这样的标识符不存在于编译器、库或用户代码中:

    以下划线和大写字母或另一个下划线开头的所有标识符始终保留供任何使用。

    “Reserved for any use”表示为 C 语言的未来版本保留。

    因此,自 C99 以来添加到该语言的所有新 语言关键字 都使用下划线后跟首字母大写来命名。 C99 中的其他示例是 _Complex_Imaginary 类型。


    对于需要与 C++ 代码兼容的情况,创建了标头 <stdbool.h>。它包含宏bool,扩展为_Bool。还有宏 falsetrue 扩展为 01

    但请注意,布尔值并未完全集成到 C 语言中,就像它们在 C++ 中一样。在 C++ 中,a == b 之类的表达式会给出 bool 类型的结果,其值为 true 或 false。在 C 中,它给出int 类型的结果,值为 1 或 0。这是出于与旧 C 代码向后兼容的原因。

    【讨论】:

      【解决方案3】:

      至于……

      此外,为什么bool 必须包含在内,为什么不属于 基本功能,例如float?

      ...我观察到虽然您需要包含stdbool.h 才能获得bool,但这是一个方便且与C++ 兼容的功能,而不是必需的。 bool_Bool 的别名,在 C99 及更高版本中,您有 _Bool 自动,但即使这样也不是必需的。在 C 中,任何整数或指针值都可以解释为布尔值,0NULL 被解释为 false,所有其他值被解释为 true。从一开始,这就是在 C 中处理布尔值的方式,并且在符合最新标准的实现中仍然有效。

      事实上,_Bool 类型本身只是这种行为的一个特例:它是一个整数类型,其最低要求是它能够表示值 0 和 1。在布尔上下文中,它只适用于与任何其他整数类型相同。

      【讨论】:

      • 在某些情况下_Bool 的工作方式与整数不同。最值得注意的浮点转换:(_Bool)0.5 给出1(int)0.5 给出0
      猜你喜欢
      • 2012-10-25
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多