【问题标题】:Need for _Bool in C99?在 C99 中需要 _Bool 吗?
【发布时间】:2014-02-20 15:56:59
【问题描述】:

我正在读一本关于 C 的书。 它说 C99 添加了数据类型 _Bool。 它基本上是一个 int 但只存储 0 或 1。 现在我不明白为什么需要这种数据类型。 我们已经有 bool 隐式转换为 int ,反之亦然。 那么有人可以告诉我这种数据类型有用的情况吗?

PS:C++ 似乎不支持here 中看到的这种数据类型。

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    _Bool b = false;
    if(b == 0)
        printf("FALSE");
    else
        printf("TRUE");
    return 0;
}

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    C 中的_Bool 与其他整数类型的语义不同。

    例如,对于整数的转换:

     (_Bool) 0.5
    

    评估为1

     (int)  0.5
    

    计算为0

    (这是 C99 基本原理为 _Bool 类型提供的示例)。

    【讨论】:

    • 您知道概述完整语义的良好信息来源吗?
    • @Dolda2000 我不会,最好直接看标准。
    • @Dolda2000 _Bool 的另一件事是 C89 基本整数类型无法做到的,(_Bool) integer_value!!integer_value 的简写。
    • @ouah:所以你是说添加新类型可以用七个或九个字符完成原本可以用两个或四个字符完成的事情(取决于需要在周围添加括号两种情况下的以下表达式)?
    【解决方案2】:

    它说C99添加了一个变量_Bool

    不,C99 添加了一个名为_Bool 的内置类型,它的值可以是01。标头&lt;stdbool.h&gt; 定义了宏,其中bool 扩展为_Boolfalse 扩展为0true 扩展为1

    另一方面,C++ 有一个名为bool 的内置类型,它的值可以是truefalse。为了兼容性,C++11 指定 stdbool.h 应该存在,但为空。 (一些 C 编译器提供 C++ 的 bool 作为 C99 之前的扩展。)

    添加 C99 的目的是提供与 C++ 相同的功能,但不会使旧的 C89 代码无效(其中可以使用普通的 bool 作为名称)。在我看来,他们提出的宏解决方案不太理想,而且确实很少看到使用布尔类型的 C 代码,而它们在 C++ 中很普遍。

    【讨论】:

      【解决方案3】:

      我们已经有了 bool

      bool_Bool 的宏。这就是为什么我们有_Bool。 (将其命名为 bool 会破坏已经使用该名称的代码;_Bool 不太可能与任何东西发生冲突。)

      【讨论】:

      • 用户定义的名称不允许以下划线后跟大写字母开头,因此_Bool 不仅不太可能与任何东西发生冲突,而且是不可能的(在标准兼容代码中) .
      【解决方案4】:

      C++ 确实有一个bool 类型,所以不用担心_Bool。在 C99 之前,C 确实 没有bool 类型;并从 C99 上的 &lt;stdbool.h&gt; 标头将 bool 定义为扩展为 _Bool 的宏。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多