【问题标题】:Is 'bool' a basic datatype in C++?'bool' 是 C++ 中的基本数据类型吗?
【发布时间】:2008-12-10 16:44:40
【问题描述】:

我在编写一些代码时遇到了这个疑问。 'bool' 是 C++ 标准中定义的基本数据类型,还是编译器提供的某种扩展?我有这个疑问是因为 Win32 有 'BOOL' 这不过是 long 的 typedef。如果我这样做会发生什么:

int i = true;

“总是”保证变量 i 的值为 1 还是再次取决于我使用的编译器?此外,对于一些接受 BOOL 作为参数的 Win32 API,如果我传递 bool 变量会发生什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    bool 是 C++ 中的基本数据类型。将true 转换为整数类型将产生1,而将false 转换将产生0(4.5/4 和4.7/4)。在 C 中,直到 C99,没有 bool 数据类型,人们做了类似的事情

    enum bool {
        false, true
    };
    

    Windows API 也是如此。从 C99 开始,我们将 _Bool 作为基本数据类型。包括stdbool.htypedef #definebool 并提供常量truefalse。由于与现有代码的兼容性问题,他们没有使 bool 成为基本数据类型(因此也成为关键字)。

    【讨论】:

      【解决方案2】:

      是的,bool 是内置类型。

      WIN32是C代码,不是C++,而且C没有bool,所以他们提供了自己的typedef BOOL。

      【讨论】:

      【解决方案3】:

      C++ 为你做了很多自动转换 - 也就是说,如果你有一个 bool 类型的变量并将它传递给期望 int 的东西,它将为你变成 int - @987654324 @ 代表false1 代表true

      我没有我的标准来确定这是否得到保证,但我使用的每个编译器都会这样做(因此可以假设它总是可以工作)。

      但是,依赖这种转换是一个坏主意。如果添加了重载int 签名等的新方法,代码可能会停止编译。

      【讨论】:

        【解决方案4】:

        是的,它是在 1993 年推出的。

        更多参考:Boolean Datatype

        【讨论】:

        • 抱歉,我没有从 Boolean Datatype 页面中看到 bool 在 1993 年成为 C 语言的一部分。现在在 1999 年,C99 标准添加了一个布尔值内置类型:称为_Bool。 (为方便起见,typedefed 到 bool,但 bool 实际上本身并不是内置类型。)
        • @ColinDBennett,是的,该链接没有引用。但是,问题是关于 C++ 的,所以 C 是切线的。快速谷歌搜索没有找到 C++ 和 1993 年的任何分类引用,只有那一年写的添加bool建议。我不想费力搜索,并假设真正的答案隐藏在某个标准中。无论哪种方式,这个有效的仅链接答案现在都是孤立的。
        • 好吧,你是对的,我不知何故错过了关于 C++ 的问题。至少the Cppreference history of C++ 声明bool 已添加到该语言的 ISO C++98 版本中。
        【解决方案5】:

        C 意味着比汇编语言高出一步。 C if 语句实际上只是“branch-if-zero”的语法糖,因此布尔值作为独立数据类型的想法在当时是一个外来概念。 (1)

        即使是现在,C/C++ 布尔值通常也只是单字节数据类型的别名。因此,它实际上更像是一个有目的的标签,而不是一个独立的数据类型。

        (1) 当然,现代编译器在处理 if 语句方面要先进一些。这是从 C 作为一种新语言的角度来看的。

        【讨论】:

          【解决方案6】:

          Turbo c 和 c++ 编译器不支持 boolean(bool 关键字)数据类型,但 dev c++ 编译器支持 boolean(bool 关键字)数据类型。

          【讨论】:

          • Turbo c/c++ 不符合 C99 - 它使用一个非常古老(现在已经过时)的标准,所以你看不到 bool 关键字。
          【解决方案7】:

          是的,C++ 支持 bool,它是一种数据类型。 供参考 - Bool data type

          【讨论】:

          • 不幸的是,您的答案并没有真正添加任何其他答案尚未说明的内容。你也忽略了问题的第二部分。
          【解决方案8】:

          尽管它现在是本机类型,但它仍然在幕后定义为整数(我认为是 int),其中文字 false 为 0,true 为 1。但我认为所有逻辑仍然认为除了 0 之外的任何东西是的,所以严格来说,真正的文字可能是编译器测试某事是否为假的关键字。

          if(someval == true){
          

          大概翻译成:

          if(someval !== false){ // e.g. someval !== 0
          

          由编译器

          【讨论】:

          • 或许可以这样实现,但至少在 VC++ 的情况下,bool 值下的 4 个字节总是设置为 0 或 1。
          • 我的意思是,四个字节解释为int的值为0或1
          • 您可能正在考虑像 VB 这样的语言,这对于 C++ 是不正确的。 x == true 不是某种测试 x 真实性的简写,它是 '==' 运算符对两个值的应用。当然,应用 C++ 令人难以置信的规则,选择应用哪个重载 operator==,并强制 x 和 true 的值...
          猜你喜欢
          • 2010-12-09
          • 1970-01-01
          • 2016-06-19
          • 2011-03-30
          • 2013-04-12
          • 2023-02-22
          • 2012-12-31
          • 1970-01-01
          相关资源
          最近更新 更多