7、流程控制(一):条件判断与多分支选择

流程控制,说白了就是让程序学会「看情况办事」。

你写代码,不可能所有情况都一条路走到黑。总得根据不同的输入、不同的状态,走不同的分支。C语言里最基础也最常用的,就是今天要聊的这三样:if/else if/elseswitch/case,还有那个看起来有点奇怪的三目运算符。

7.1 if/else if/else:最朴实的条件判断

我个人习惯,90%的场景都用if。为什么?因为它最直观,可读性最好。

int score = 85;

if (score >= 90) {
    printf("优秀\n");
} else if (score >= 80) {
    printf("良好\n");
} else if (score >= 60) {
    printf("及格\n");
} else {
    printf("不及格\n");
}

这段代码,你一眼就能看明白逻辑。从上往下,哪个条件先满足,就执行哪个分支。

注意: else if 本质上就是 else { if (...) } 的简写。但千万别写成 elseif,C语言不认这个。

我在项目中遇到过一个问题:有人把if (a = 1)写成了赋值,结果条件永远为真。嗯,这里要注意——=是赋值,==才是比较。我建议你养成习惯,把常量写在左边:if (1 == a)。这样万一写成=,编译器会报错。

7.2 switch/case:多分支的利器

如果分支特别多,比如根据星期几做不同的事,用if写起来就有点啰嗦了。这时候switch/case更合适。

int day = 3;

switch (day) {
    case 1:
        printf("周一\n");
        break;
    case 2:
        printf("周二\n");
        break;
    case 3:
        printf("周三\n");
        break;
    case 4:
        printf("周四\n");
        break;
    case 5:
        printf("周五\n");
        break;
    default:
        printf("周末\n");
        break;
}

你想想看,如果换成if,得写5个else if,多累。

核心要点:
  • switch 后面跟的表达式必须是整型(char也算整型)
  • case 后面必须是常量表达式,不能是变量
  • 每个 case 最后一般要加 break,否则会「穿透」到下一个 case

说到穿透,我曾经踩过一个坑。有一次写菜单程序,忘了在某个case后面加break,结果用户选1,程序把1、2、3的逻辑全跑了一遍。调试了半天才发现。所以我现在写switch,每个case写完第一件事就是加break

不过穿透也不全是坏事。有时候你故意利用它,让多个case共享同一段代码:

switch (grade) {
    case 'A':
    case 'B':
        printf("通过\n");
        break;
    case 'C':
        printf("补考\n");
        break;
    default:
        printf("不通过\n");
        break;
}

你看,AB走同一个逻辑,省了不少代码。

7.3 三目运算符:简洁但别滥用

三目运算符长这样:条件 ? 表达式1 : 表达式2。如果条件为真,执行表达式1,否则执行表达式2。

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

这比写if (a > b) max = a; else max = b;简洁多了。

但我个人建议,三目运算符只用在简单的赋值场景。一旦嵌套起来,可读性会急剧下降:

// 别这么写,真的
int result = (x > 0) ? ((y > 0) ? 1 : 2) : 3;

你想想看,这代码过两周你自己回来看,都得琢磨半天。何必呢?

我的习惯: 三目运算符只用于「二选一」的简单赋值。超过两层嵌套,老老实实用 if

7.4 三者怎么选?

我总结了一个简单的选择逻辑:

场景 推荐用法 原因
分支少(2-3个),条件复杂 if/else if/else 可读性好,支持任意条件
分支多(4个以上),条件简单 switch/case 结构清晰,效率略高
简单二选一赋值 三目运算符 代码简洁

说白了,没有绝对的「哪个更好」,只有「哪个更合适」。我见过有人把所有if都改成三目运算符,结果代码跟天书一样。也见过有人明明只有两个分支,非要写switch,看着别扭。

7.5 知识体系图

下面这张图,帮你理清今天讲的核心逻辑:

流程控制(一)知识体系 条件判断与分支 if / else if / else switch / case 三目运算符 支持任意条件表达式 可读性好,最常用 注意 == 和 = 的区别 仅支持整型常量 多分支时结构清晰 别忘了 break 简洁的二选一赋值 避免嵌套使用 可读性优先 核心原则:没有最好的,只有最合适的 根据场景选择,可读性永远第一

7.6 避坑总结

最后,把我这些年踩过的坑整理一下:

  • if 条件里用赋值if (x = 5) 永远为真。我建议把常量放左边,或者开启编译器警告。
  • switch 忘记 break:会造成穿透。除非你故意利用,否则每个 case 都要加 break。
  • 三目运算符嵌套:代码会变得很难读。我见过最夸张的嵌套了5层,维护的人想骂娘。
  • 浮点数比较:别用 if (f == 0.1),浮点数有精度问题。用 fabs(f - 0.1) < 1e-6 更靠谱。

好了,流程控制的第一部分就聊到这儿。记住一句话:代码是写给人看的,顺便给机器执行。可读性永远比炫技重要。


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