第3.3章: if-else
if-else 语句
if 决定是否执行某条语句。
if-else 在两条语句之间做选择:
if (cond) {
;
} else {
;
}
和之前一样,; 只是一个空语句。
else if
当分支超过两个时,你可以用 else if 串联条件:
if (x < 0) {
print("negative\n");
} else if (x == 0) {
print("zero\n");
} else {
print("positive\n");
}
只有第一个匹配的分支会执行。
初始化语句
if 或 else if 可以在条件之前声明变量。
C++ 允许两种不同的写法。
该变量只存在于整个 if / else if / else 链内部。
形式 1
::std::uint_least32_t a{3};
::std::uint_least32_t b{9};
if (::std::int_least32_t sum = a + b) { // condition is: sum != 0
println("sum != 0, a=", a, ", b=", b, ", sum=", sum);
} else {
println("sum == 0, a=", a, ", b=", b, ", sum=", sum);
}
在这种形式中,条件就是该变量是否非零。
形式 2
if (auto sum = a + b; sum > 10) {
println("sum > 10, a=", a, ", b=", b, ", sum=", sum);
} else if (sum == 10) {
println("sum == 10, a=", a, ", b=", b, ", sum=", sum);
} else {
println("sum < 10, a=", a, ", b=", b, ", sum=", sum);
}
在这种形式中,先声明变量,然后再检查一个独立的条件。
两种形式下,变量(sum)都在整条链结束后被销毁。
始终使用 { }
对 if、else if 和 else,初学者应当始终使用花括号。
不加花括号时,极易把 else 挂到错误的 if 上。
❌ 错误(有歧义)
if (a)
if (b)
;
else
; // attaches to the inner if, not the outer one
这就是经典的“悬垂 else”问题。
✔️ 正确
if (a) {
if (b) {
;
} else {
;
}
}
花括号让结构清晰,并防止出错。
另一个令人困惑的例子
不加花括号时,这段代码看起来像 else 属于第一个 if:
❌ 错误
if (x > 0)
if (x == 1)
print("one\n");
else
print("not one\n"); // actually belongs to the inner if
但 else 总是与最近的未匹配的 if 配对。
✔️ 正确
if (x > 0) {
if (x == 1) {
print("one\n");
} else {
print("not one\n");
}
}
始终使用花括号。它消除了所有歧义。
要点
- if-else 做选择:
if选一条路径;if-else在两条之间选。 - else if 链:多个有序条件用
else if。 - 初始化语句:
if (init) ...与if (init; cond)两种形式都会声明一个对整个链有效的变量。 - 单语句规则:不加花括号时,每个分支只控制一条语句。
- 空语句:
if (cond) ;或else ;什么也不做,几乎总是 bug。 - 悬垂 else:
else绑定到最近的if;花括号可防止混淆。 - 清晰性:一致地使用花括号让代码更易读、更易安全修改。