在 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
,你应该没问题。
在我正在处理的一段代码中,如果某些 _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
,你应该没问题。