C语言学习笔记 - 64.流程控制18 - 选择结构中的if与switch

一、本节学习定位

本节内容属于 流程控制 中的选择结构部分。C 语言中的选择结构主要包括两类:

  1. if 语句

  2. switch 语句

在实际入门学习中,if 语句 使用频率更高,也是学习流程控制的重点。switch 语句主要用于处理"表达式的值等于某些固定常量"的多分支问题,适合菜单选择、等级分类、命令分发等场景。

本节当前重点是继续深入掌握 if 语句 ,后续再系统学习 switch 语句


二、选择结构的基本概念

选择结构用于根据条件选择不同的执行路径。

例如:

复制代码
if (score >= 60)
{
    printf("及格\n");
}
else
{
    printf("不及格\n");
}

程序会先判断:

复制代码
score >= 60

如果条件成立,则执行:

复制代码
printf("及格\n");

否则执行:

复制代码
printf("不及格\n");

这就是典型的二分支选择结构。


三、C语言中的两种选择语句

语句类型 主要用途 适用场景 学习重点
if 条件判断 范围判断、复杂逻辑判断、大小比较 当前重点
switch 多分支匹配 固定值匹配、菜单命令、等级字符判断 后续补充

四、if语句是选择结构的学习重点

1. if语句适用范围更广

if 语句可以判断任意表达式的真假,适合处理各种复杂条件。

例如成绩区间判断:

复制代码
if (score >= 90 && score <= 100)
{
    printf("优秀\n");
}
else if (score >= 80 && score < 90)
{
    printf("良好\n");
}
else if (score >= 60 && score < 80)
{
    printf("及格\n");
}
else
{
    printf("不及格\n");
}

这里每一个条件都是一个逻辑表达式,因此使用 if...else if...else 更自然。


2. if语句可以处理范围判断

例如:

复制代码
score >= 90 && score <= 100

表示:

复制代码
score 大于等于 90,并且 score 小于等于 100

这种"范围判断"是 if 语句的典型应用场景。


3. if语句可以处理复杂逻辑

例如:

复制代码
if (age >= 18 && score >= 60)
{
    printf("符合条件\n");
}

该条件同时判断年龄和成绩,只有两个条件都成立时才执行输出语句。


五、switch语句的基本作用

switch 语句 用于实现多分支选择结构。它根据某个表达式的值,跳转到对应的 case 分支执行。

基本形式如下:

复制代码
switch (表达式)
{
    case 常量1:
        语句1;
        break;

    case 常量2:
        语句2;
        break;

    case 常量3:
        语句3;
        break;

    default:
        默认语句;
        break;
}

其中:

关键字 含义
switch 根据表达式的值进行多分支选择
case 表示一个匹配入口
break 跳出 switch 结构
default 当前面所有 case 都不匹配时执行

六、switch语句示例:按等级输出分数段

1. 程序功能

从键盘输入一个成绩等级字符:

输入字符 输出分数段
A 85~100
B 70~84
C 60~69
D <60
其他字符 输入错误

2. 示例程序

复制代码
#include <stdio.h>

int main(void)
{
    char grade;

    printf("请输入成绩等级 A/B/C/D:");
    scanf("%c", &grade);

    printf("Your score: ");

    switch (grade)
    {
        case 'A':
            printf("85~100\n");
            break;

        case 'B':
            printf("70~84\n");
            break;

        case 'C':
            printf("60~69\n");
            break;

        case 'D':
            printf("<60\n");
            break;

        default:
            printf("enter data error!\n");
            break;
    }

    return 0;
}

3. 程序讲解

代码 作用
char grade; 定义字符变量,用于保存成绩等级
scanf("%c", &grade); 从键盘输入一个字符
switch (grade) 根据 grade 的值选择分支
case 'A': grade 等于 'A' 时执行
break; 执行完当前分支后跳出 switch
default: 当前面所有 case 都不匹配时执行

七、switch语句的执行流程

以输入 A 为例:

复制代码
输入:A

程序执行流程如下:

  1. 读取字符 'A',存入变量 grade

  2. 执行 switch (grade)

  3. grade 的值依次与各个 case 常量比较;

  4. 找到匹配项:

    case 'A':

  5. 执行:

    printf("85~100\n");

  6. 遇到:

    break;

  7. 跳出整个 switch 结构。

最终输出:

复制代码
Your score: 85~100

八、switch中的break非常重要

1. 正确写法

复制代码
case 'A':
    printf("85~100\n");
    break;

break 的作用是终止当前 switch 结构,防止程序继续向下执行后面的 case 分支。


2. 缺少break的后果

如果省略 break

复制代码
switch (grade)
{
    case 'A':
        printf("85~100\n");

    case 'B':
        printf("70~84\n");

    case 'C':
        printf("60~69\n");

    case 'D':
        printf("<60\n");

    default:
        printf("enter data error!\n");
}

当输入 A 时,程序会从 case 'A' 开始一直向下执行,直到 switch 结束。

可能输出:

复制代码
85~100
70~84
60~69
<60
enter data error!

这通常不是预期结果。


九、switch与if的区别

对比维度 if语句 switch语句
判断方式 判断表达式真假 匹配表达式的固定值
适合场景 范围判断、复杂条件 固定常量匹配
条件形式 可以是任意关系表达式或逻辑表达式 通常是整型或字符型表达式
分支数量 可多可少 适合多个固定分支
是否需要break 不需要 通常每个 case 后需要
可读性 复杂多分支时可能冗长 固定值多分支时更清晰

十、什么时候用if,什么时候用switch

1. 适合使用if的情况

当条件是范围判断或复杂逻辑时,应优先使用 if

例如:

复制代码
if (score >= 90 && score <= 100)
{
    printf("优秀\n");
}

这里判断的是一个区间,适合用 if


2. 适合使用switch的情况

当判断对象是某个固定值时,可以使用 switch

例如:

复制代码
switch (grade)
{
    case 'A':
        printf("优秀\n");
        break;

    case 'B':
        printf("良好\n");
        break;

    case 'C':
        printf("及格\n");
        break;

    default:
        printf("输入错误\n");
        break;
}

这里判断的是字符 'A''B''C' 等固定值,适合用 switch


十一、switch使用注意事项

  1. switch 后面的表达式通常应为 整型表达式字符型表达式

  2. case 后面必须是 常量常量表达式,不能是变量或范围表达式。

  3. 每个 case 常量不能重复。

  4. default 不是必须的,但建议保留,用于处理异常输入。

  5. 一般情况下,每个 case 分支最后都应写 break;

  6. 如果故意省略 break;,应明确知道会发生"继续向下执行"的效果。

  7. case 只是入口标号,不是独立的条件判断。


十二、错误示例:不能用switch直接判断分数范围

以下写法是错误思路:

复制代码
switch (score)
{
    case score >= 90:
        printf("优秀\n");
        break;
}

原因是:

复制代码
score >= 90

不是 case 所要求的固定常量。

如果要判断成绩范围,应使用 if...else if...else

复制代码
if (score >= 90 && score <= 100)
{
    printf("优秀\n");
}
else if (score >= 80 && score < 90)
{
    printf("良好\n");
}
else if (score >= 60 && score < 80)
{
    printf("及格\n");
}
else
{
    printf("不及格\n");
}

十三、VSCode中验证switch程序

1. 新建源文件

建议文件名:

复制代码
switch_grade.c

2. 编写代码

将以下代码保存到文件中:

复制代码
#include <stdio.h>

int main(void)
{
    char grade;

    printf("请输入成绩等级 A/B/C/D:");
    scanf("%c", &grade);

    switch (grade)
    {
        case 'A':
            printf("85~100\n");
            break;

        case 'B':
            printf("70~84\n");
            break;

        case 'C':
            printf("60~69\n");
            break;

        case 'D':
            printf("<60\n");
            break;

        default:
            printf("enter data error!\n");
            break;
    }

    return 0;
}

3. 编译程序

在 VSCode 终端中执行:

复制代码
gcc switch_grade.c -o switch_grade.exe

如果想查看更多潜在警告,可以使用:

复制代码
gcc -Wall switch_grade.c -o switch_grade.exe

4. 运行程序

复制代码
./switch_grade.exe

5. 测试输入

输入 预期输出
A 85~100
B 70~84
C 60~69
D <60
E enter data error!

十四、本节要点总结

  1. C 语言选择结构主要包括 ifswitch

  2. 当前学习重点是 if 语句,因为它适用范围更广。

  3. switch 适合处理固定值匹配的多分支问题。

  4. if 适合处理范围判断和复杂逻辑条件。

  5. switch 中的 case 只是入口标号,不是条件判断语句。

  6. break 用于跳出 switch,一般不能省略。

  7. default 用于处理所有 case 都不匹配的情况。

  8. 判断成绩区间时,通常使用 if...else if...else ,不适合直接用 switch

  9. 使用 VSCode 练习时,应通过不同输入观察程序分支执行结果。


十五、参考出处

  1. 《C程序设计(第五版)》谭浩强,第 3 章"最简单的 C 程序设计------顺序程序设计":C 语言控制语句分类,包含 ifswitchbreak 等控制语句。

  2. 《C程序设计(第五版)》谭浩强,第 4 章"选择结构程序设计":if 语句与 switch 语句,多分支选择结构。

  3. 《C程序设计(第五版)》谭浩强,第 4.7 节"用 switch 语句实现多分支选择结构":switchcasedefaultbreak 的使用方法。

  4. 郝斌《C语言自学入门教程》对应内容:选择结构中 ifswitch 的学习顺序和重点。

  5. VSCode-C/C++ 环境配置实践:使用 GCC 编译、运行和测试 C 程序。