程序经常要根据条件走不同路径:分数是否及格、菜单选了哪一项、枚举当前是哪种颜色。C++ 用 if / else 处理比较和范围,用 switch 处理若干个固定取值,用三目运算符 ?: 写很短的二选一。条件表达式的写法见关系与逻辑运算符。本节说明这三种结构怎么选、括号和 break 容易写错的地方。

if 与 else

if 后面括号里的条件会转成真或假:整数非 0 为真,指针非空为真。条件为真时执行 if 后面的语句(或花括号里的一块),否则看有没有 else if / else。单条语句可以省略花括号,但嵌套或以后要加语句时容易看错对应关系,建议分支里始终写花括号。

开始条件?真执行 if 分支假执行 else 分支后续代码结束

条件为真执行 if 分支,为假执行 else 分支,然后汇合到后续代码。

C++ if 分支运行
#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)做标签,少写无含义的数字。

C++ switch 与 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。