正确写法是用&&连接多个条件,避免逗号或中文“和”;每个子条件加括号,注意!优先级低于比较运算符;防赋值误写为相等,推荐常量左置;复杂逻辑应封装为具名函数。

多个条件用 && 连接,不是用逗号或中文“和”
很多人初学时会写成 if (a > 0, b 或 <code>if (a > 0 和 b ,这在 C++ 里是错的。逗号是逗号表达式,只返回最后一个值;中文字符直接编译不过。真正表示“同时满足”的逻辑与操作符是 <code>&&。
它要求所有条件都为真(非零),整个表达式才为真:
if (a > 0 && b 0、b
-
&&有短路求值:前面一个条件为假,后面根本不会计算,比如ptr != nullptr && ptr->value > 0是安全的写法 - 别和位运算符
&混淆——&是按位与,不带短路,也不适合逻辑判断 - 条件太多时建议拆成变量或函数,提升可读性,比如
bool is_valid = (a > 0) && (b
括号不是可选的,尤其涉及混合运算符时
当条件里混用比较、算术、逻辑运算符,优先级容易出错。比如 if (a + b > 10 && c == d || e),&& 优先级高于 ||,但人眼容易误读。不加括号可能让逻辑和预期不符。
稳妥做法是:每个独立子条件加括号,逻辑组之间也加括号:
if ((a + b > 10) && (c == d) || (e > 0))
- 即使语法上某处括号冗余(如
(a > 0)),也建议保留——它明确划清了逻辑单元 - 特别注意
!的优先级比比较运算符低,!a == b等价于(!a) == b,不是!(a == b);后者必须写成!(a == b) - IDE 通常会高亮括号匹配,善用这个视觉提示能快速发现漏括号
避免把赋值 = 错写成相等 ==
这是 C++ 里极其常见又隐蔽的 bug。比如写成 if (a = 5 && b > 0),本意是判断 a == 5,结果却把 5 && b > 0 的结果赋给了 a,然后判断 a 是否非零——不仅逻辑错,还意外修改了变量。
- 把常量放左边能触发编译错误:
if (5 == a && b > 0),万一错写成5 = a,编译器立刻报错 - 启用编译器警告(如 GCC/Clang 的
-Wparentheses或-Wint-in-bool-context)能捕获很多这类问题 - 现代写法倾向用更明确的布尔变量或
[[likely]]/[[unlikely]]标注分支,但基础条件本身仍要写对
复杂条件建议封装成具名函数,而不是堆在 if 里
当 if 条件超过 3–4 个子条件,或者含义不够直观(比如“用户可编辑且未过期且权限足够且非只读模式”),硬塞进一行 if 会让后续维护者抓狂。
直接提取成函数,名字就是逻辑本身:
bool can_edit_document(const User& u, const Doc& d) {
return u.is_authenticated() &&
!d.is_expired() &&
u.has_permission("edit") &&
!d.is_readonly();
}
if (can_edit_document(user, doc)) { ... }
- 函数名承担了文档作用,比注释更可靠
- 便于单元测试:你可以单独测
can_edit_document的各种边界情况 - 如果某条规则变化(比如新增“需在工作时间”),只改一个地方,而不是翻遍所有
if
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











