必须用&&判断布尔条件,用&进行位运算;&&短路求值保安全,&全求值;&&返回0/1,&保持原类型;权限检查等场景误用&&会导致语义错误。

用 && 还是 &?先看表达式类型和意图
如果操作数是布尔值或用于条件判断(比如 if、while 的条件部分),必须用 &&;如果操作数是整数且你要处理二进制位(比如检查标志位、掩码提取),必须用 &。混用会编译通过但语义错误——&& 只关心“非零即真”,& 计算的是实际位模式。
&& 有短路,& 没有:副作用行为完全不同
短路不是优化技巧,是语言定义的行为差异,直接影响代码是否安全:
-
ptr != nullptr && ptr->data > 0:若ptr为空,ptr->data根本不执行,不会崩溃 -
ptr != nullptr & ptr->data > 0:两个子表达式都求值,空指针解引用直接 UB(未定义行为) - 函数调用也一样:
valid() && heavy_calc()中,valid()返回false时heavy_calc()不执行;换成&就一定执行
返回值类型不同,影响赋值和后续计算
&& 总是返回 int 类型的 0 或 1(C++17 起是 bool),而 & 返回与操作数一致的整型(如 unsigned char、int):
-
int a = 6, b = 3; int x = a && b;→x == 1(逻辑真) -
int y = a & b;→y == 2(二进制110 & 011 = 010) - 若你写
flags & READ_MASK却误用&&,结果只剩0或1,无法再做位运算(比如继续& WRITE_MASK)
常见误用场景:权限检查、寄存器读取、协议解析
这些地方几乎从不用 &&,因为目标不是“真假判断”,而是“位存在性”:
- 检查第 3 位是否置位:
if (status & 0x04)✅;if (status && 0x04)❌(后者只判status是否非零) - 清零低 4 位:
reg &= ~0x0F✅;reg = reg && ~0x0F编译失败(类型不匹配)或语义全错 - 组合多个标志:
open_flags = READ_FLAG | WRITE_FLAG→ 必须用|,||会丢掉高位信息
最易忽略的点:C/C++ 中整数在逻辑上下文中自动转为布尔,但这个转换不可逆——一旦用了 &&,原始位宽和位布局就永远丢失了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











