第六章 流程控制(一):if语句、if-else语句、else if多分支、switch-case语句
流程控制,说白了就是让程序学会「做选择」。
你想想看,如果代码只能从上往下一条条执行,那跟流水账有什么区别?真正的程序,得能根据不同的情况走不同的路。这一章,我们就来聊聊C语言里最基础、也最常用的几种分支结构。
6.1 if语句:最简单的判断
if语句,是C语言里最直白的条件判断。它的逻辑就是:如果条件成立,就执行某段代码。
if (条件表达式) {
// 条件为真时执行的代码
}
这里有个细节我特别想强调:条件表达式的结果必须是整型或可以隐式转换为整型的值。0代表假,非0代表真。很多新手会写成 if (x = 5),这其实是赋值操作,结果恒为真——我当年刚学C时也踩过这个坑。
核心要点:
- if后面跟的是圆括号,不是花括号
- 即使只有一条语句,也建议加上花括号——避免后续修改时出错
- 条件表达式不要写成赋值表达式
6.2 if-else语句:二选一
现实中的选择往往不是「做或不做」,而是「做A还是做B」。if-else就是干这个的。
if (条件) {
// 条件为真
} else {
// 条件为假
}
我在项目中遇到过这样一个场景:判断用户输入的年龄是否成年。用if-else写起来非常清晰——成年走一条路,未成年走另一条。这种二选一的逻辑,用if-else比用两个独立的if要优雅得多,而且效率也更高。
小技巧:如果if和else分支里都有return语句,那else其实可以省略。但为了可读性,我建议还是保留else——除非你写的是那种极简风格的内核代码。
6.3 else if多分支:多个条件排队
当你有多个互斥的条件需要判断时,else if就派上用场了。
if (条件1) {
// 条件1成立
} else if (条件2) {
// 条件1不成立,条件2成立
} else if (条件3) {
// 条件1、2都不成立,条件3成立
} else {
// 以上都不成立
}
这里有个容易忽略的点:条件的顺序很重要。我曾经在写一个成绩等级判断程序时,把 score >= 90 和 score >= 80 的顺序写反了——结果90分以上的学生全被归到了80分段。嗯,这种bug特别隐蔽,因为代码语法完全正确,只有逻辑错了。
避坑指南:else if不是C语言的关键字,它其实是「else + if」的组合写法。所以每个else if本质上是一个嵌套在else里的if语句。理解这一点,你就能明白为什么else if可以无限接下去了。
6.4 switch-case语句:多路分支的利器
当你的条件是基于某个整型表达式的不同取值时,switch-case往往比一长串else if更清晰。
switch (表达式) {
case 常量1:
// 代码
break;
case 常量2:
// 代码
break;
default:
// 默认处理
break;
}
switch-case有几个关键点:
- 表达式必须是整型(char、short、int、long等,但不能是float或double)
- case后面必须是常量,不能是变量或表达式
- 别忘了break——否则会「穿透」到下一个case
说到穿透,我记得有一次调试一个菜单程序,用户按1、2、3分别执行不同功能。结果按1之后,1、2、3的功能全执行了一遍——就是因为忘了加break。从那以后,我写switch-case的第一件事就是先把break写上,再填业务逻辑。
什么时候用switch-case,什么时候用else if?
我个人习惯:如果条件是「等于某个固定值」,用switch-case;如果条件是「范围判断」(比如大于、小于),用else if。switch-case的跳转表实现通常比else if链更快,但前提是case值比较密集。
6.5 知识体系总览
下面这张图,把本章的核心知识点串了起来。你可以把它当作一张「流程控制地图」——每次写分支代码前,瞄一眼就知道该用哪种结构。
6.6 实际应用中的选择
说了这么多,到底什么时候用哪种?我总结了一个简单的判断流程:
- 只有一个条件需要判断? → 用if
- 需要二选一? → 用if-else
- 多个条件互斥,且是范围判断? → 用else if
- 多个条件互斥,且是等值判断? → 用switch-case
这个顺序,基本覆盖了日常开发中90%的场景。剩下的10%,可能是嵌套分支、条件运算符(?:)或者查表法——那些我们后面再聊。
个人经验:写分支代码时,我习惯先把「正常流程」写清楚,再处理异常情况。比如先写if条件成立时的主逻辑,else里处理错误或边界情况。这样读代码的人一眼就能看到主线,不会被异常处理分散注意力。
6.7 避坑总结
最后,把这一章最容易踩的坑列出来,你写代码时多留个心眼:
| 常见错误 | 错误示例 | 正确写法 |
|---|---|---|
| if条件里用赋值 | if (x = 5) |
if (x == 5) |
| switch漏掉break | case 1: ... case 2: ... |
case 1: ... break; case 2: ... break; |
| else if顺序错误 | 先判断score >= 60再判断score >= 90 |
先判断score >= 90再判断score >= 60 |
| 花括号省略 | if (x) y=1; z=2; |
if (x) { y=1; z=2; } |
嗯,这一章的内容就到这里。流程控制是编程的骨架,把if、else、switch这些基础打牢了,后面学循环、函数、指针时才会更顺手。代码写多了你会发现,再复杂的逻辑,拆开来也就是一个个「如果…就…否则…」的组合。
公众号:蓝海资料掘金营,微信deep3321