5、选择结构:if、if-else、switch-case、三目运算符

选择结构,说白了就是让程序学会「做决定」。

你想想看,一个程序如果只会从上往下一条条执行,那跟流水账有什么区别?真正有用的代码,一定会在某个岔路口停下来想一想:「如果条件成立,我走这边;否则,我走那边」

我个人习惯把选择结构比作「代码里的红绿灯」。今天我们就来把这四种红绿灯——ifif-elseswitch-case、三目运算符——彻底讲透。

核心要点:选择结构是控制程序流程的基础。掌握它们,你就能写出有「判断力」的代码。
选择结构知识体系 选择结构 if 单分支 if-else 双分支 switch-case 多分支 三目运算符 条件为真时执行 二选一 多选一(等值判断) 简洁赋值 if (条件) { ... } if (条件) { ... } else { ... } switch (expr) { case ... } a = (条件) ? b : c

5.1 if 单分支:最简单的判断

if 是选择结构里最基础的形式。它的逻辑很简单:如果条件成立,就执行里面的代码;否则跳过

int score = 85;
if (score >= 60) {
    cout << "恭喜,及格了!" << endl;
}

嗯,这里要注意:if 后面的条件必须用括号括起来。花括号里可以写任意多行代码。如果只有一行,花括号可以省略——但我个人建议永远不要省略。为什么?

我在项目中遇到过好几次这样的坑:有人为了省事没写花括号,后来维护时加了一行代码,结果那行代码不管条件是否成立都会执行。调试了半天才发现是花括号的问题。所以,养成加花括号的习惯,能省掉很多不必要的麻烦

小技巧:条件表达式里,非零值被视为 true,零被视为 false。所以 if (x) 等价于 if (x != 0)

5.2 if-else 双分支:二选一

现实中的判断往往不是「做或不做」,而是「做这个,还是做那个」。这时候就需要 if-else 了。

int age = 17;
if (age >= 18) {
    cout << "已成年,可以进入。";
} else {
    cout << "未成年,禁止入内。";
}

说白了,这就是一个岔路口:条件为真走上面,为假走下面。两条路只能选一条。

你还可以嵌套使用:

int score = 75;
if (score >= 90) {
    cout << "优秀";
} else if (score >= 80) {
    cout << "良好";
} else if (score >= 60) {
    cout << "及格";
} else {
    cout << "不及格";
}

这种写法叫 if-else if-else 链。它本质上还是 if-else 的嵌套,只是写法更清晰。我曾经见过有人把这种链写到十几层,那代码简直没法看。遇到这种情况,就该考虑用 switch-case 或者重构了。

避坑指南:我曾经在嵌套 if 时忘记加 else,导致某些情况走了两条分支。后来我养成了一个习惯:写完 if 后立刻补上 else,哪怕 else 里暂时是空的。这样逻辑更完整,也方便以后扩展。

5.3 switch-case:多路分支的利器

当你要根据一个变量的多个取值做不同处理时,switch-caseif-else 链更清晰。

int day = 3;
switch (day) {
    case 1:
        cout << "周一";
        break;
    case 2:
        cout << "周二";
        break;
    case 3:
        cout << "周三";
        break;
    case 4:
        cout << "周四";
        break;
    case 5:
        cout << "周五";
        break;
    default:
        cout << "周末";
        break;
}

这里有几个关键点:

  • switch 后面的表达式必须是整型或枚举类型(不能是浮点数或字符串)
  • 每个 case 后面必须是常量表达式
  • break 用来跳出 switch,否则会「穿透」到下一个 case

说到穿透,我记得有一次写菜单程序,故意利用穿透来合并多个 case:

char grade = 'B';
switch (grade) {
    case 'A':
    case 'B':
    case 'C':
        cout << "通过";
        break;
    case 'D':
        cout << "补考";
        break;
    default:
        cout << "不通过";
        break;
}

你看,A、B、C 三个等级都走同一个分支。这种写法很简洁,但一定要在注释里说明意图,不然别人看代码会一脸懵。

什么时候用 switch,什么时候用 if-else?
  • 如果判断的是等值关系(比如星期几、菜单选项),用 switch 更清晰
  • 如果判断的是范围或复杂条件(比如分数区间、逻辑组合),用 if-else 更灵活

5.4 三目运算符:最简洁的选择

三目运算符是 C++ 里唯一一个需要三个操作数的运算符。它的格式是:

条件表达式 ? 值1 : 值2

如果条件为真,整个表达式的结果是「值1」;否则是「值2」。

int a = 10, b = 20;
int max = (a > b) ? a : b;  // max = 20

说白了,这就是一个压缩版的 if-else。我个人很喜欢用它来做简单的赋值,代码看起来干净利落。

但要注意:不要滥用。我曾经见过有人把三目运算符嵌套三层:

int result = (x > 0) ? ((y > 0) ? 1 : 2) : ((y > 0) ? 3 : 4);

这种代码,写的人爽了,看的人想打人。我的建议是:三目运算符只用于简单的二选一赋值。一旦逻辑复杂,老老实实用 if-else

实用场景:三目运算符经常用在 cout 里直接输出结果:
cout << (score >= 60 ? "及格" : "不及格");

5.5 四种选择结构的对比

结构 适用场景 优点 缺点
if 单一条件判断 简单直接 只能处理一种情况
if-else 二选一或范围判断 灵活,支持复杂条件 嵌套过多可读性差
switch-case 多选一(等值判断) 结构清晰,效率高 只能处理整型/枚举
三目运算符 简单二选一赋值 代码简洁 嵌套后难以阅读

最后说一句:选择结构是编程的基础,但也是很多 bug 的源头。我见过太多因为条件写反、漏掉 else、忘记 break 导致的线上事故。写选择结构时,多花一分钟检查逻辑,可能省下后面一小时的调试时间。

总结:
  • if 和 if-else 是最通用的选择结构,适合各种条件判断
  • switch-case 适合等值多分支,记得加 break
  • 三目运算符是语法糖,适合简单赋值
  • 无论用哪种,清晰第一,简洁第二

公众号:蓝海资料掘金营,微信deep3321