5、选择结构:if、if-else、switch-case、三目运算符
选择结构,说白了就是让程序学会「做决定」。
你想想看,一个程序如果只会从上往下一条条执行,那跟流水账有什么区别?真正有用的代码,一定会在某个岔路口停下来想一想:「如果条件成立,我走这边;否则,我走那边」。
我个人习惯把选择结构比作「代码里的红绿灯」。今天我们就来把这四种红绿灯——if、if-else、switch-case、三目运算符——彻底讲透。
5.1 if 单分支:最简单的判断
if 是选择结构里最基础的形式。它的逻辑很简单:如果条件成立,就执行里面的代码;否则跳过。
int score = 85;
if (score >= 60) {
cout << "恭喜,及格了!" << endl;
}
嗯,这里要注意:if 后面的条件必须用括号括起来。花括号里可以写任意多行代码。如果只有一行,花括号可以省略——但我个人建议永远不要省略。为什么?
我在项目中遇到过好几次这样的坑:有人为了省事没写花括号,后来维护时加了一行代码,结果那行代码不管条件是否成立都会执行。调试了半天才发现是花括号的问题。所以,养成加花括号的习惯,能省掉很多不必要的麻烦。
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 或者重构了。
5.3 switch-case:多路分支的利器
当你要根据一个变量的多个取值做不同处理时,switch-case 比 if-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 更灵活
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