程序经常要根据条件走不同路径:分数是否及格、菜单选了哪一项、枚举当前是哪种颜色。C++ 用 if / else 处理比较和范围,用 switch 处理若干个固定取值,用三目运算符 ?: 写很短的二选一。条件表达式的写法见关系与逻辑运算符。本节说明这三种结构怎么选、括号和 break 容易写错的地方。
if 与 else
if 后面括号里的条件会转成真或假:整数非 0 为真,指针非空为真。条件为真时执行 if 后面的语句(或花括号里的一块),否则看有没有 else if / else。单条语句可以省略花括号,但嵌套或以后要加语句时容易看错对应关系,建议分支里始终写花括号。
条件为真执行 if 分支,为假执行 else 分支,然后汇合到后续代码。
#include <iostream>
int main() {
int score = 76;
if (score >= 90) {
std::cout << "A\n";
} else if (score >= 60) {
std::cout << "Pass\n";
} else {
std::cout << "Fail\n";
}
return 0;
}输出:
Pass因为分数是 76,不满足 >= 90,所以不走第一支;因为 76 满足 >= 60,所以打印 Pass,后面的 else(不及格)不会执行。else if 按书写顺序检查,一旦某支成立,后面的支都跳过。因此要把更严的条件写在前面:若先写 >= 60 再写 >= 90,90 分也会被判成及格,永远进不了 A。
一个 else 只对应它上面最近的那个 if,空格缩进不会改变对应关系。下面这段里,else 属于内层的 if (b),并不属于 if (a):
if (a)
if (b)
f();
else
g(); // 对应 if (b)若希望 a 为假时执行 g(),给内层 if 加上花括号,让 else 对着外层:
if (a) {
if (b) {
f();
}
} else {
g(); // 对应 if (a)
}嵌套时始终写花括号,就不容易看错谁配谁。
三目运算符
写法是 条件 ? 表达式1 : 表达式2:条件为真时用表达式 1 的值,否则用表达式 2。两个分支的类型要能放到同一个结果里。只适合很短的二选一(例如取较大值);层数一多就改用 if。
#include <iostream>
int main() {
int a = 3, b = 7;
int max_val = (a > b) ? a : b;
std::cout << max_val << std::endl;
return 0;
}因为 3 不大于 7,条件为假,所以 max_val 取 b,输出 7。
switch 语句
switch 拿一个整数或枚举,与各个 case 上的常量比较是否相等。匹配后从该 case 往下执行,直到遇到 break 或 switch 结束。适合“取值等于哪一个标签”的多路分支;score >= 60 这种范围判断仍用 if。C++ 里更宜用枚举(尤其是 enum class)做标签,少写无含义的数字。
#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
Color c = Color::Green;
switch (c) {
case Color::Red:
std::cout << "Red\n";
break;
case Color::Green:
std::cout << "Green\n";
break;
default:
std::cout << "Other\n";
break;
}
return 0;
}输出:
Green因为 c 是 Green,所以进入对应 case,打印后 break 离开 switch,不会执行 default。
| 要素 | 作用 | 注意 |
|---|---|---|
case | 常量标签 | 必须是编译期常量,不能写变量或区间 |
default | 没有标签匹配时执行 | 通常放在最后 |
break | 结束整个 switch | 漏写会继续执行后面的 case |
漏写 break
匹配到某标签后如果没有 break,会接着执行后面的标签里的语句。这称为贯穿。有意共用一段处理时,可以把多个 case 叠在一起,并写注释说明;无意漏写则会造成错误输出。
int n = 1;
switch (n) {
case 1:
std::cout << "one ";
// 这里没有 break
case 2:
std::cout << "two\n";
break;
default:
std::cout << "other\n";
break;
}因为 n 为 1,先进入 case 1 打出 one ;因为没有 break,会继续执行 case 2,再打出 two。结果是 one two,而不是只打印 one。
若干个取值做同一件事时,可以写成 case 1: case 2: case 3: 后接公共语句和 break,这是有意的贯穿。
与输入配合
用 std::cin 读菜单编号再 switch 是常见写法。若输入不是整数,流会进入失败状态,choice 可能保持旧值,后面的比较会反复走错分支。应先判断读取是否成功,失败时提示并 clear、丢掉错误输入,见输入输出。
int choice = 0;
if (!(std::cin >> choice)) {
std::cerr << "invalid input\n";
} else {
switch (choice) {
case 1:
std::cout << "open\n";
break;
case 2:
std::cout << "save\n";
break;
default:
std::cout << "unknown\n";
break;
}
}if 与 switch 怎么选
- 范围或组合条件(如
score >= 60 && score < 90)用if链。 - 与若干常量比是否相等(菜单编号、
enum class)用switch更清楚。 - 浮点数不要直接
==,也不要用switch;用误差范围配合if。
本节说明了 if、三目运算符与 switch 的基本用法,以及漏写 break 时的贯穿。下一节介绍循环:while、for 与 do-while。