C++中布尔值仅true/false,非零即真、零即假;支持算术/指针等隐式转bool;&&和||短路求值;避免赋值误写、指针比true、浮点直接判等陷阱。
在C++中,布尔值(bool)只有两个取值:true 和 false,它们分别对应整数 1 和 0。但逻辑判断真正依赖的,不是变量类型本身,而是表达式求值后的“真值性”(truthiness)——即非零即为 true,零即为 false。
C++ 允许将任意算术类型、指针、枚举等隐式转换为 bool。转换规则非常简单:
-1、0.001、非空指针、非空字符串首地址)→ 转为 true
bool b = 2; 是合法的,b 的值是 true,但 2 本身不会被保留——bool 只存 true/false,不存原始数值逻辑与(&&)和逻辑或(||)采用短路策略:一旦结果确定,后续操作数不再计算。
a && b:若 a 为 false,则 b 不执行(哪怕 b 是函数调用)a || b:若 a 为 true,则 b 被跳过ptr != nullptr && ptr->valid()
看似简单的判断,容易因类型混用或优先级出错:
if (x = 5) 是赋值,永远为 true(除非 5 是 0),应写 if (x == 5)
== true 没意义:if (ptr == true) 实际等价于 if (ptr != 0),但可读性差,直接写 if (ptr) 更清晰double d = 0.1 + 0.2;,if (d == 0.3) 很可能为 false,而 if (d) 虽安全但掩盖精度问题现代 C++ 强调意图明确。以下写法更健壮:
if (ptr) 代替 if (ptr != nullptr)(两者等价,前者更简洁)== true 或 != false,直接 if (flag) 或 if (!flag)
const bool hasPermission = user.level >= ADMIN && !user.isBlocked;
基本上就这些。C++ 的布尔逻辑不复杂,但隐式转换和短路特性容易忽略,理解清楚才能写出既正确又易维护的判断逻辑。