投射到 _Bool

rwa*_*ace 4 c types casting boolean

传统上,C 中的布尔值用int或表示char。新_Bool类型使意图更清晰,但还有另一个有趣的功能:它似乎将浮点数转换为它,不会向零截断,而是与精确零进行比较:

#include <stdio.h>

int main(int argc, char **argv) {
  double a = 0.1;
  int i = (int)a;
  printf("%d\n", i);
  _Bool b = (_Bool)a;
  printf("%d\n", b);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

印刷

0
1
Run Code Online (Sandbox Code Playgroud)

所以这是一个语义差异。还有一个我很满意;它复制了使用浮点数作为条件的效果。

这是可以全面依赖的东西吗?新的 C 标准是否将强制转换 X 的结果定义_BoolX ? 1 : 0对于所有有效操作的 X 都相同?

Vla*_*cow 5

在 C 标准(6.3.1.2 布尔类型)中有写

1 任何标量值转换为_Bool 时,如果值比较等于0,则结果为0;否则,结果为 1。

也就是说,在转换为类型_Bool的过程中,编译器不会尝试将具有转换运算符的表达式的操作数的值(向零截断或其他内容)表示为整数。它只检查值是否等于或不等于零。

其实这个声明

 _Bool b = (_Bool)a;
Run Code Online (Sandbox Code Playgroud)

相当于

 _Bool b = a;
Run Code Online (Sandbox Code Playgroud)