第四章 流程控制(一):让程序学会“思考”

各位同学,欢迎来到流程控制的世界。

前面我们学的变量、运算符、表达式,说白了都是“死”的。程序从上往下一条条执行,像念流水账。但真正的程序,需要根据不同的情况做不同的事——这就是流程控制。

我个人习惯把流程控制比作十字路口。程序跑到这里,得停下来看看:红灯停,绿灯行。今天我们就来聊聊C语言里最基础的几个“交通指挥员”。

本章核心知识点:

  • if 语句:最简单的条件判断
  • if-else 语句:二选一的分支
  • else if 多分支:多个条件依次判断
  • switch-case 语句:多路选择的利器
  • 条件运算符:三目运算符的妙用
流程控制(一)知识体系 流程控制 if 语句 if-else 语句 else if 多分支 switch-case 条件运算符 ? : 每个分支都对应一种条件判断方式,实际开发中经常组合使用

4.1 if 语句:最简单的判断

if 语句长什么样?看个例子就明白了。

int score = 85;
if (score >= 60) {
    printf("及格了!\n");
}

括号里写条件,条件为真就执行大括号里的代码。条件为假就跳过。

小提示: 我个人习惯,哪怕 if 后面只有一条语句,也加上大括号。为什么?因为后来加代码时容易忘加括号,导致逻辑错误。这个习惯帮我省了不少调试时间。

我在项目中遇到过这样一个bug:有个同事写 if 没加括号,后面加了一行日志打印,结果日志每次都执行,条件判断完全失效了。嗯,这种坑踩过一次就记住了。

4.2 if-else 语句:二选一

生活不只有“是”,还有“否”。if-else 就是处理这种二选一场景的。

int temperature = 30;
if (temperature > 25) {
    printf("开空调\n");
} else {
    printf("开风扇\n");
}

条件为真走 if 分支,为假走 else 分支。就这么简单。

你想想看,如果不用 else,你得写两个 if:

if (temperature > 25) {
    printf("开空调\n");
}
if (temperature <= 25) {
    printf("开风扇\n");
}

这样写不仅啰嗦,而且效率低——两个条件都要判断。用 if-else 只判断一次就够了。

注意: else 不能单独使用,必须跟在 if 后面。我曾经见过新手写 else 不带 if,编译直接报错。

4.3 else if 多分支:多个条件排队

现实中的判断往往不止两个分支。比如成绩评级:90分以上是A,80分以上是B,70分以上是C,60分以上是D,不及格是E。

这时候 else if 就派上用场了。

int score = 85;
if (score >= 90) {
    printf("等级:A\n");
} else if (score >= 80) {
    printf("等级:B\n");
} else if (score >= 70) {
    printf("等级:C\n");
} else if (score >= 60) {
    printf("等级:D\n");
} else {
    printf("等级:E(不及格)\n");
}

执行逻辑是:从上往下依次判断,遇到第一个为真的条件就执行对应的分支,然后跳出整个结构。后面的条件不再判断。

这里有个细节要注意:条件的顺序。如果把 score >= 60 放在最前面,那 85 分也会匹配到 D,因为 85 >= 60 为真。所以写多分支时,条件范围要从大到小排列,或者从小到大排列,总之要有序。

核心要点: else if 不是关键字,而是 else 后面跟了一个 if 语句。本质上就是嵌套的 if-else 结构,只是写法更简洁。

4.4 switch-case 语句:多路选择的利器

如果判断的条件是某个变量的具体值,而不是范围,用 switch-case 更合适。

举个例子,根据星期几输出不同的活动安排:

int day = 3;  // 假设 1=周一,7=周日
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;
    case 6:
    case 7:
        printf("周末:休息\n");
        break;
    default:
        printf("无效的星期\n");
        break;
}

switch 后面的表达式必须是整型(int、char、enum 等),不能是浮点数或字符串。case 后面跟常量值,不能是变量。

这里有个关键点:break 不能忘。如果 case 3 后面没有 break,程序会继续执行 case 4 的代码,这叫“穿透”。有时候故意利用穿透,比如上面的 case 6 和 case 7 共用一段代码。

我曾经踩过的坑: 有一次写 switch 忘了加 break,结果程序执行完一个 case 后把后面所有 case 都跑了一遍。排查了半天才发现是 break 漏了。从那以后,我写完 switch 都会逐行检查 break。

switch-case 和 else if 怎么选?我个人习惯:

  • 判断条件是一个变量的多个具体值 → 用 switch-case,代码更清晰
  • 判断条件是范围、逻辑组合、浮点数 → 用 else if

4.5 条件运算符:三目运算符

条件运算符是 C 语言里唯一一个三目运算符。格式是:

表达式1 ? 表达式2 : 表达式3

如果表达式1为真,整个表达式的值等于表达式2;否则等于表达式3。

看个实际例子:

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

这行代码等价于:

int max;
if (a > b) {
    max = a;
} else {
    max = b;
}

三目运算符让代码更简洁。但不要滥用——嵌套的三目运算符可读性很差。

我的建议: 三目运算符适合简单的二选一赋值。如果逻辑复杂,老老实实写 if-else,代码是给人读的,不是用来炫技的。

再举个例子,判断奇偶数:

int num = 7;
printf("%s\n", (num % 2 == 0) ? "偶数" : "奇数");

你看,一行代码搞定。如果用 if-else 得写好几行。

4.6 综合对比:什么时候用哪个?

场景 推荐写法 原因
单个条件判断 if 最简单直接
二选一 if-else 比两个 if 效率高
多个范围判断 else if 条件有序,逻辑清晰
多个具体值判断 switch-case 代码结构清晰,可读性强
简单二选一赋值 条件运算符 代码简洁

好了,流程控制的第一部分就讲到这里。这些基础语句看着简单,但实际项目中到处都是它们的身影。写代码时多想想:这个场景用哪种判断方式最合适?代码是不是够清晰?别人能不能一眼看懂?

记住一句话:好的代码,首先是给人读的,其次才是给机器执行的。


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