if语句中不加花括号{}仅控制下一行,易引发逻辑错误;条件中禁用赋值符=,推荐常量左置防误写;else严格匹配最近未配对的if,与缩进无关。

if 语句的基本写法和括号要不要加
不加花括号 {} 只能控制紧跟着的一条语句,这是新手掉进最多坑的地方。比如:
if (x > 0)
y = 1;
z = 2; // 这行永远执行!不是 if 的一部分
哪怕你缩进了,编译器也不认。所以只要逻辑不止一行,或者未来可能扩展,就老老实实加 {} —— 不是“可选”,是“必须”。
单行也建议加,统一风格,避免后续补代码时出错。
条件表达式里别写赋值操作符 =
把 = 写成 == 是 C++ 里最经典的误报 bug,编译器通常只给 warning(比如 condition is always true),但程序照跑,结果错得离谱。
立即学习“C++免费学习笔记(深入)”;
常见错误现象:
-
if (x = 5)—— 永远为真(因为赋值后值是 5),且 x 被悄悄改了 -
if (ptr = nullptr)—— 把指针清空了,还当它为空来判断
解决办法:把常量放左边,比如 if (5 == x),这样写错成 if (5 = x) 直接编译失败;或者打开编译器警告(-Wparentheses 或 /W4),并把它当错误处理。
else 怎么匹配 if
C++ 规定 else 总是绑定到离它最近的、尚未配对的 if 上,不管缩进怎么排。这个规则容易被视觉误导。
比如这段代码:
if (a > 0)
if (b > 0)
cout << "both positive";
else
cout << "a <= 0";
实际效果是:只有当 a > 0 且 b 时才输出 <code>"a —— 因为 <code>else 绑的是内层 if (b > 0),不是外层。
要让它按缩进意图工作,必须用 {} 显式划清范围:
if (a > 0) {
if (b > 0)
cout << "both positive";
} else {
cout << "a <= 0";
}
if 和 switch 在什么场景下该选哪个
单纯比性能:连续整数 case(如 0,1,2,3)下 switch 通常编译成跳转表,O(1);而一串 if-else if 是顺序判断,最坏 O(n)。但现代编译器对简单 if 链也会优化,别过早纠结这点。
真正该选 switch 的时候:
- 判断的是同一个整型/枚举变量,且分支多(≥4)、值集中
- 需要 fall-through(比如
case 1: case 2:共享逻辑),而if做不到
该坚持用 if 的时候:
- 条件是范围判断(
x 、<code>str == "quit") - 涉及浮点比较、指针判空、函数调用结果等非编译期常量
- 分支逻辑差异大,复用性低,硬塞进
switch反而难读
别为了“看起来高级”硬套 switch,C++ 里 if 才是通用主力,switch 是特化工具。
嵌套太深、分支太多时,真正该想的不是 if 还是 switch,而是能不能拆函数、用查表、或引入状态机——这些地方最容易被忽略,但影响更大。











