【发布时间】:2021-06-16 18:08:25
【问题描述】:
#include <stdbool.h>
#include <stdio.h>
int main ()
{
bool a, b;
a = 1;
b = 4;
if (a == b)
printf ("They are equal\n");
else
printf ("They are different\n");
}
此代码打印They are equal
- 怎么会这样?变量
a和b是否在赋值中填充了值0x1,而不管我为它们分配了什么?或者可能是被黑客入侵以处理bools 的==? - 此行为是否可跨 C 标准库实现和编译器移植?
- 在引入
stdbool.h之前,逻辑比较两个bool/int的正确方法是什么?
【问题讨论】:
-
参见C11 6.3.1.2:当任何标量值转换为
_Bool时,如果值比较等于0,则结果为0;否则,结果是1。 所以你的b会自动分配给1。 -
值
4(任何非0值)表示true。 -
@WeatherVane 我认为 OP 想知道
b是否转换为1,因为否则这两个布尔值将以不同的方式存储在内存中,并且无法使用==进行比较。 -
@AndySukowski-Bang 我的意思是存储的值将是
true,因为4被认为是真实的。 -
@WeatherVane 我理解你的意思,但是如果
bool b被存储为4,它在内存中会是这样的00000100,但它与bool a不同,它将像这样存储00000001。因此bool b需要转换为1。
标签: c boolean comparison-operators c-standard-library