【问题标题】:What can bool type return in C99?C99 中的 bool 类型可以返回什么?
【发布时间】:2016-03-26 21:11:39
【问题描述】:

什么是 bool 保证返回的?我可以依靠 bool 类型始终被解释为 0 或 1 吗?如果布尔的数值解释在 C99 中不可靠,是否有标准?在依赖 bool 进行算术运算时,我应该在 LLVM、GCC 或 Visual C++ 中注意什么?

例如,如果我这样做会怎样:

// An example of calculating a possible stride in bytes.
// hasData(), is8bit(), and is16bit() return as bool type

unsigned int stride = object->hasData() * object->size() * 
                      (object->is8bit()  * sizeof(uint8_t) + 
                       object->is16bit() * sizeof(uint16_t));

在示例中,我押注 bool 类型只返回 0 或 1。

【问题讨论】:

  • 参见6.2.5.2声明为 _Bool 类型的对象足够大,可以存储值 0 和 1。6.3.1.2当任何标量值是转换为 _Bool,如果值比较等于 0,则结​​果为 0;否则,结果为 1。
  • 任何实际的实现都会使_Bool 更大。 (实际上它将有空间存储 0..255)。 C 保证unsigned int 有空间容纳 65535。该帖子被问到一个相当于问“我保证 unsigned int 永远不会计算为大于 65535?”的问题。对于 unsigned int,答案是“否”。对于 _Bool,它是“是”。
  • 您的标题显示为“C99”,但您的标签包含“C++”。是哪个?
  • 如果您遇到问题,请检查您的标头不要在某处使用 #define booltypedef bool ...从 C89 迁移的代码可能会这样做,而不是包含 C99 的 #include <stdbool.h>
  • @M.M 本来想问C++11这个问题,但是忘记改标签了。

标签: c standards arithmetic-expressions integer-arithmetic


【解决方案1】:

什么是 bool 保证返回的?我可以依靠 bool 类型始终被解释为 0 或 1 吗?

在严格遵循的程序中,_Bool(或来自stdbool.hbool)表达式保证被评估为01

如果您从 bool 表达式中获得不同的值,则意味着您正在上游调用一些未定义的行为。

【讨论】:

    【解决方案2】:

    表达式的布尔值始终为1 (true) 或0 (false),并且其类型为int 而不是_Bool

    C99 - 7.16:

    1. 标题<stdbool.h> 定义了四个宏。
      • bool 扩展为 _Bool
    2. 其余三个宏适用于#if 预处理指令。他们是
      • true : 扩展为整数常量1,
      • false:扩展为整数常量0,以及
      • __bool_true_false_are_defined 扩展为整数常量 1。

    【讨论】:

    • 粗体部分可以解释:宏truefalse实际上有int类型,而不是_Bool。在大多数情况下,这没有区别,但值得牢记,例如sizeof(true) 可能与 sizeof(bool) 不同
    【解决方案3】:

    在 C++ 中,bool 是一种保证包含truefalse 的类型。当转换为int(如您的示例)时,它们分别对应于 1 和 0。

    【讨论】:

      【解决方案4】:

      C99 标准要求编译器生成 0 或 1 的 _Bool 值。C++ 也有此要求。不,我不知道描述这一点的标准文档的确切页面。

      当然,在推出 16 年后,编译器中仍有可能存在错误,如果我们有一个编译器,例如,10 年的历史,并且在它出现时没有很好地测试 C99 兼容性,那就更是如此产生。但我经常编写依赖于编译器从条件表达式中生成 0 或 1 的代码。

      【讨论】:

      • 在 C 中,关系运算符总是被指定为 (int)1(int)0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2018-05-27
      • 2012-08-24
      • 1970-01-01
      • 2019-07-08
      相关资源
      最近更新 更多