第六章 流程控制(一):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 >= 90score >= 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 知识体系总览

下面这张图,把本章的核心知识点串了起来。你可以把它当作一张「流程控制地图」——每次写分支代码前,瞄一眼就知道该用哪种结构。

流程控制(一):分支结构 条件判断 if 单分支 if-else 双分支 else if 多分支 switch-case 条件为真时执行 条件为假时跳过 适合单一判断场景 二选一逻辑 真/假各走一路 最常用的分支结构 多个互斥条件 按顺序依次判断 注意条件的优先级 等值多路分支 case后必须是常量 别忘了加break 选择原则:范围用if-else,等值用switch-case 所有分支结构都支持嵌套,但嵌套层数建议不超过3层 超过3层时,考虑用函数封装或查表法替代

6.6 实际应用中的选择

说了这么多,到底什么时候用哪种?我总结了一个简单的判断流程:

  1. 只有一个条件需要判断? → 用if
  2. 需要二选一? → 用if-else
  3. 多个条件互斥,且是范围判断? → 用else if
  4. 多个条件互斥,且是等值判断? → 用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