在C99中bool type return可以做什么?

What can bool type return in C99?

布尔保证 return 是什么?我可以依赖 bool 类型始终被解释为 0 或 1 吗?如果 bool 的数值解释在 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 类型 returning 0 或 1。

What is bool guaranteed to return as? Can I rely on a bool type to always be interpreted as 0 or 1?

在一个严格符合的程序中,_Bool(或 stdbool.h 中的 bool)表达式保证被计算为 01

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

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

C99-7.16:

  1. The header <stdbool.h> defines four macros.
  2. The macro
    • bool expands to _Bool.
  3. The remaining three macros are suitable for use in #if preprocessing directives. They are
    • true : which expands to the integer constant 1,
    • false: which expands to the integer constant 0, and
    • __bool_true_false_are_defined which expands to the integer constant 1.

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

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

当然,在引入 16 年后,编译器中仍有可能存在错误,如果我们的编译器已经使用了 10 年,并且没有经过良好的 C99 兼容性测试它被生产出来了。但是我经常编写依赖编译器从条件表达式生成 0 或 1 的代码,例如。