在 C 中添加 _Bool 类型

Addition with _Bool type in C

在我正在处理的一段代码中,如果某些 _Bool 为真,我需要将 1 添加到 unsigned long

我一直在用

unsigned long l;
_Bool b;
... //stuff happens to both variables
if(b)
    ++l;

但是我在C标准中看到_Bool类型被归类为“标准无符号整数类型”之一,并且保证将true表示为1,将false表示为0。

我用这个看似等价的表达式替换了我的代码

unsigned long l;
_Bool b;
... //stuff happens to both variables
l+=b;

我的编译器没有任何问题,它似乎工作得很好。

这是否保证有效,还是我只是在我的编译器中利用 _Bool 的实现?

Is this guaranteed to work

是的,C 中的布尔值只是整数,因此在我所知道的任何编译器下,向整数添加布尔值都是完全可以接受的。 C 是弱类型的,因此布尔值和整数值之间没有明显区别。声明为 _Bool 的变量的唯一意义在于它会自动将分配给它的任何值转换为 1 或 0。

_Bool x = 3; //x will be 1
int y = 7;
int z = y + x; //z will be 8

几乎 保证有效。

标准并没有说 _Bool 对象只能保存值 0 和 1。事实上 sizeof(_Bool) 至少是 1,这意味着它至少有 8 位,这意味着它原则上至少可以包含 256 个不同的值。

如果您为 b 赋值的代码相当合理,您可以安全地假设它的值为 0 或 1。从其他类型到 _Bool 的所有转换都保证产生0 或 1 的值。

但是您可以在 _Bool 对象中存储 0 或 1 以外的值,尽管这样做的任何方法都可能具有未定义的行为。

一个例子:

#include <stdio.h>
#include <string.h>
int main(void) {
    _Bool b;
    char c = 42;
    memcpy(&b, &c, 1);
    long n = 0;
    n += b;
    printf("n = %ld\n", n);
}

我系统上的输出是

n = 42

但只要你不做这样的傻事,并以起码的尊重对待 _Bool,你应该没问题。