【问题标题】:What is bool in C/C++? A keyword or a macro?C/C++ 中的布尔值是什么?关键字还是宏?
【发布时间】:2013-08-05 05:15:45
【问题描述】:

我提到了this question,其中一些答案表明bool 是一个整数类型(IDE 也将其视为关键字)。

但是,没有一个答案表明cplusplus 中提供的信息,即bool 是通过<cstdbool> 添加的宏(在这种情况下,编译器可能会在编译时隐式添加此标头允许bool)。这是<stdbool.h>的g++版本。

那么bool 到底是什么?整数类型关键字或宏?

【问题讨论】:

  • C 还是 C++?请选择一个。
  • @LightnessRacesinOrbit 想知道两种语言的答案并没有错
  • @OleksiyDobrodum:在这种情况下,我建议问两个问题。
  • @Lightness,问 2 个内容相同但“C”和“C++”字符串的问题,听起来很傻,而且没有任何价值。你为什么要学究气?
  • @iammilind:这不是迂腐;这是两种不同的语言,有不同的规则(正如答案所解释的那样),我们不会将关于不同主题的多个问题集中到 SO 上的同一篇文章中!或者我们是否也应该问一下布尔值在 PHP、JavaScript、Perl 中是如何工作的......

标签: c++ c boolean keyword


【解决方案1】:

在 C 中,bool 是一个宏。

C 中没有名为bool 的内置类型或关键字,因此典型的实现分别使用标准库#definetruefalse10。诸如if 语句的规则是根据“零”和“非零”表达式定义的,因此依赖于truefalse 的扩展宏定义:

[C99: 6.8.4.1/2]: 在这两种形式中,如果表达式比较不等于 0,则执行第一个子语句。在 else 形式中,如果表达式比较等于 0,则执行第二个子语句。如果通过标签到达第一个子语句,第二个子语句不被执行。

为方便起见,C99 添加了内置的中间类型_Bool,这种语言的实现通常是#definebool_Bool。这种类型是这样定义的:

[C99: 6.2.5/2]: 声明为 _Bool 类型的对象大到足以存储值 0 和 1。

这允许与 C++ 程序更好地兼容,其中可能包括使用 bool 类型的函数声明;不过,真的,#define _Bool int 可能就足够了。


在 C++ 中,bool 既是内置类型又是关键字。

您提供的链接没有说 bool 是 C++ 中的宏。它说:

这个头文件在C中的目的是添加一个bool类型和真假值作为宏定义。

在直接支持这些类型的 C++ 中,标头仅包含一个宏,可用于检查该类型是否受支持。

这是正确的。

语义(即,就代码的“含义”而言),[C++11: 3.9.1/2]bool 定义为 C++ 中的整数类型。

词法(即,就代码中的“外观”而言),[C++11: 2.12/1] 将其列为关键字。事实上,作为整数类型名称一部分的all标记也是关键字,包括(但不限于):

  • int
  • unsigned
  • long
  • bool
  • short
  • signed

然而,从不是 C++ 中的宏。相反,您会得到一个宏 __bool_true_false_are_defined,您可以在多语言代码中使用它来切换 bool 的处理,具体取决于您使用 C 还是 C++;请注意,我不确定我能想出一个有用的例子。

【讨论】:

  • 即使我没有在我的问题中说“bool 是 C++ 中的宏”:-)。我想知道它是如何治疗的。很好,您提供了标准参考。
  • 在 C++ 中,bool 是定义为 bool(关键字)的宏。 false 定义为 false,true 定义为 true。谁在乎 ?我是因为我的 IDE 颜色 bool 作为宏而不是关键字,因为...(这很丑)我可以访问真实类型的唯一方法是使用 #undef
  • @Winter:那不是真的;一些代码/库/标题/实现正在这样做。执行 #define bool bool#define true true#define false false 的程序实际上具有未定义的行为(尽管我可以粗略地想象一个糟糕的 stdlib 实现这样做)所以它肯定不是“在 C++ 中”
  • @BoundaryImposition 它在 stdbool.h 中完成,并表示“在 C++ 中支持 是 GCC 扩展”。我的设置没有什么奇怪的,在 debian 上使用 gcc 4.9.2。
  • @Winter:是的,所以,C 头文件仅作为标准库实现的扩展包含在内。与 C++ 无关。简单地不要使用标题,你会没事的。
【解决方案2】:

在 C 中,bool 是来自 stdbool.h 的宏,它扩展为 C 布尔类型 _Bool

【讨论】:

  • 仅从 C99 开始。在此之前,C 中没有任何布尔类型。此外,_Boolnumeric,这可能不是人们对 C++ 的期望。真的,_Bool 不是“布尔类型”;它只是一个足以存储10 的数字类型。
  • @LightnessRacesinOrbit 我尊重在 C 标准中将 _Bool 称为 boolean 类型 的 C 术语。
  • 6.1.3.2 的标题是“布尔类型”,但只讨论转换:When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1. 按照任何传统逻辑,它都是一种假布尔类型。
  • @LightnessRacesinOrbit 这就是它被称为布尔类型的原因。它是一个整数类型,但转换的行为不像其他整数类型。例如,(bool) 0.51,但 (char) 0.5(int) 0.50boolean type 一词在标准中的 7.18 Boolean type and values 中也有提及。
【解决方案3】:

那么 bool 到底是什么?是整数类型关键字还是宏?

在 C++ 中,它被称为 布尔字面量,它是内置类型。

§2.14.7

bool、char、char16_t、char32_t、wchar_t 类型以及有符号和无符号整数类型统称为整数类型

§2.14.6

布尔字面量

boolean-literal:
false
true

布尔文字是关键字 falsetrue。这样的文字是纯右值并且具有 bool 类型。

§ 3.9.1.6

bool 类型的值为真或假。 [ 注意:没有有符号、无符号、短或长 bool 类型或值。 — 尾注] bool 类型的值参与积分促销 (4.5)。

【讨论】:

    【解决方案4】:

    在 C++ 中,bool 是一种内置数据类型。在 C 中它不是,所以如果你在 C 中使用 bool,它已经被实现为 typedef 或 #define,并且 truefalse 必须已经用 #define 实现或者可能是常量.

    【讨论】:

      【解决方案5】:

      在 C 中没有像布尔变量这样的概念,是的,Java、C# 等高级语言为我们提供了声明布尔变量的工具,我们使用该变量来设置它为真或假。

      但是您可以像我们在 C 中那样使用积分来实现这一点

      if(1)
      {
         // Because C treats 1 and any other integer as true
      }
      if(0)
      {
         // This time our if condition will result in false
      }
      

      【讨论】:

      • 在 C 中,有一个类型 _Bool,而字面常量 truefalse 定义在一个标头中。而在 C 语言中,比较运算符正式生成int,该语言的设计目的是让您可以在其中进行编程,就好像它具有真正的布尔类型一样;至少 30 年来,这种做法或多或少都是被推荐的做法。
      • 这真的让我吃惊,谢谢詹姆斯,我从来不知道。
      • 如果有人对C中的布尔变量有疑问,请访问-stackoverflow.com/questions/1921539/using-boolean-values-in-c这仅表示您不能直接制作布尔变量,您需要使用typedef关键字定义它,因此答案是Both因为我们可以使用#define true 来定义它,而在其他语言中,它也是一个关键字。
      • 你看答案了吗。如果包含<stdbool.h>,则可以像在C++ 中一样使用booltruefalse。形式上,它们是不同的,但是当正常使用时,这些差异对您的代码没有影响。
      • 是的,谢谢詹姆斯
      【解决方案6】:

      在 C 中,_Bool 是一个类型,booltruefalse 是在 stdbool.h 中定义的宏

      ISO C11 标准状态(在 6.2.5 类型部分)

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

      stdbool.h 定义了 4 个宏。

      1. bool 扩展为 _Bool
      2. true 扩展为 1
      3. false 扩展为 0
      4. __bool_true_false_are_defined 扩展为 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 2011-01-15
        • 2011-08-06
        • 2020-08-13
        • 2014-09-27
        相关资源
        最近更新 更多