C语言switch语句如何高效使用?

99ANYc3cd6
预计阅读时长 19 分钟
位置: 首页 C语言 正文

switch 语句是一种多路分支结构,它允许一个变量或表达式与一系列值进行比较,并根据匹配的值执行相应的代码块,这比使用多个 if-else if-else 语句在某些情况下更清晰、更高效。

c语言switch语言
(图片来源网络,侵删)

switch 语句的基本语法

switch 语句的基本结构如下:

switch (expression) {
    case constant1:
        // 当 expression 的值等于 constant1 时,执行这里的代码
        break;
    case constant2:
        // 当 expression 的值等于 constant2 时,执行这里的代码
        break;
    case constant3:
        // 当 expression 的值等于 constant3 时,执行这里的代码
        break;
    default:
        // expression 的值不匹配任何一个 case,执行这里的代码
        break;
}

语法详解

  1. switch (expression)

    • expression 是一个整型表达式(包括 int, char, short, long 等,因为 char 在本质上是整型)。
    • 它不能是浮点型(如 float, double)或其他复杂数据类型。
    • 这个表达式的值会与下面每个 case 后面的 constant 进行比较。
  2. case constant:

    • constant 必须是一个常量或常量表达式(不能是变量)。
    • 每个 case 后面的值必须是唯一的,不能有重复。
    • switchexpression 值与某个 caseconstant 匹配时,程序会从该 case 的位置开始执行。
    • 注意case 后面跟的是 (冒号),而不是 (分号)。
  3. break; 语句

    c语言switch语言
    (图片来源网络,侵删)
    • breakswitch 语句中至关重要的部分。
    • 它的作用是立即跳出整个 switch 语句,防止程序“掉落”(fall-through)到下一个 case 中执行。
    • 如果省略了 break,程序会继续执行下一个 case 的代码,直到遇到一个 breakswitch 语句的结束大括号 。
  4. default:

    • default 是一个可选的部分,类似于 if-else 结构中的 else
    • expression 的值与所有 case 都不匹配,程序就会执行 default 后面的代码。
    • default 可以放在 switch 语句的任何位置,但通常放在最后,这样逻辑更清晰,它也可以不加 break,因为它是最后一个分支。

break 语句与“掉落”(Fall-through)现象

这是 switch 语句最容易出错也最需要理解的地方。

示例:省略 break 的情况

#include <stdio.h>
int main() {
    int grade = 'B'; // 使用字符,因为字符是整型
    switch (grade) {
        case 'A':
            printf("优秀!\n");
            break; // 如果匹配到 'A',执行完这句就退出 switch
        case 'B':
            printf("良好!\n");
            // 这里没有 break,所以程序会继续执行下一个 case
        case 'C':
            printf("及格!\n");
            // 这里也没有 break
        case 'D':
            printf("不及格!\n");
            break; // 遇到 break,才退出 switch
        default:
            printf("无效的成绩!\n");
            break;
    }
    return 0;
}

输出结果:

c语言switch语言
(图片来源网络,侵删)
良好!
及格!
不及格!

分析:grade 的值是 'B' 时,程序进入 case 'B',打印 "良好!",因为没有 break,程序不会退出 switch,而是继续向下执行 case 'C'case 'D' 的代码,直到遇到 case 'D' 中的 break 才停止。


switchif-else if-else 的选择

什么时候用 switch,什么时候用 if-else if-else

特性 switch 语句 if-else if-else 语句
判断条件 只能判断整型(或字符)的单一值 可以判断任何类型的表达式,包括范围(如 x > 10)、关系(如 x == y)和逻辑(如 x && y)。
可读性 当需要判断一个变量与多个离散值是否相等时,switch 结构更清晰。 当判断逻辑复杂(涉及范围、布尔条件等)时,if-else 更自然。
执行效率 对于多路分支,switch 通常比一连串的 if-else if 更高效,因为它可能使用“跳转表”(jump table)实现。 效率取决于条件的复杂性和数量。
“掉落”特性 有独特的“掉落”特性,有时可以利用(见下文),但初学者容易出错。 没有“掉落”特性,每个 else if 是独立的。

  • switch:当你明确需要检查一个变量是否等于 ABCD... 这样的具体值时。
  • if-else if-else:当你需要检查范围(score > 90)、组合条件(age > 18 && gender == 'M')或者数据类型不是整型时。

switch 语句的进阶用法

1 利用“掉落”特性

虽然“掉落”通常是bug的来源,但在某些特定场景下,它可以被巧妙地利用。

示例:判断元音字母

#include <stdio.h>
int main() {
    char ch = 'e';
    switch (ch) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            printf("%c 是一个元音字母,\n", ch);
            break;
        default:
            printf("%c 是一个辅音字母,\n", ch);
            break;
    }
    return 0;
}

分析: ch'e',程序会进入 case 'e',但由于没有 break,它会继续向下“掉落”,执行 printf 语句。ch'a',它会直接“掉落”到 printf 语句,这样,一个 printf 就处理了所有元音字母的情况,代码更简洁。

2 在 case 中使用变量(C99 及以后)

在 C99 标准及之后,case 标签可以使用变量,但该变量必须是 const 或字面量,因为 case 的值必须在编译时确定。

const int A = 1;
const int B = 2;
int main() {
    int x = 2;
    switch (x) {
        case A: // 合法
            printf("A\n");
            break;
        case B: // 合法
            printf("B\n");
            break;
        // case x: // 非法!x 是变量,编译时会报错
        //     printf("x\n");
        //     break;
    }
    return 0;
}

完整示例

示例:一个简单的计算器

#include <stdio.h>
int main() {
    char operator;
    double num1, num2;
    printf("请输入一个运算符 (+, -, *, /): ");
    scanf("%c", &operator);
    printf("请输入两个数字: ");
    scanf("%lf %lf", &num1, &num2);
    switch (operator) {
        case '+':
            printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);
            break;
        case '-':
            printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);
            break;
        case '*':
            printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);
            break;
        case '/':
            // 处理除数为零的情况
            if (num2 != 0) {
                printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);
            } else {
                printf("错误:除数不能为零,\n");
            }
            break;
        default:
            printf("错误:无效的运算符,\n");
            break;
    }
    return 0;
}

switch 语句是 C 语言中一个强大且常用的控制流工具,理解其核心要点至关重要:

  1. 只用于整型:表达式必须是整型。
  2. case 是常量case 后的值必须是唯一的常量。
  3. break 是关键:记得在每个 case 的末尾使用 break,除非你故意利用“掉落”特性。
  4. default 是兜底:处理所有未匹配的情况,提高代码的健壮性。
  5. 合理选择:根据判断条件的类型(单一值 vs. 范围/复杂条件)来决定使用 switch 还是 if-else
-- 展开阅读全文 --
头像
dede后台参数空白
« 上一篇 前天
C语言如何高效入门?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

目录[+]