c语言 switch 循环

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

switch 本身不是一个循环,而是一个多路分支选择语句。

c语言 switch 循环
(图片来源网络,侵删)
  • switch 语句:根据一个变量的值,从多个代码块中选择一个来执行,它像是一个多向的岔路口,程序只能选择其中一条路走下去。
  • 循环语句:用于重复执行一段代码,直到某个条件不再满足,它像一个跑圈,程序会一遍又一遍地绕着同一段路跑。

尽管它们是两种不同的控制流结构,但它们经常组合在一起使用,以实现更复杂的逻辑,通过一个循环来不断接收用户输入,然后使用 switch 来根据输入执行不同的操作。

下面我们分开讲解,最后再讲如何组合使用。


switch 语句详解

switch 语句提供了一种基于变量值进行多路分支的简洁方式。

基本语法

switch (expression) {
    case constant1:
        // 当 expression 的值等于 constant1 时,执行这里的代码
        break;
    case constant2:
        // 当 expression 的值等于 constant2 时,执行这里的代码
        break;
    // 可以有任意数量的 case
    default:
        // 当 expression 的值与所有 case 都不匹配时,执行这里的代码
        break;
}

关键规则

  1. expression (表达式)

    • 必须是一个整型表达式(int, char, long, short 等)或枚举类型。
    • 不能是浮点数(如 float, double)或字符串。
  2. constant (常量)

    • 每个 case 后面的值必须是常量或常量表达式(如 10 + 20),不能是变量。
    • 所有 case 的值必须是唯一的,不能重复。
  3. break 语句

    • 极其重要! break 语句的作用是跳出 switch 语句
    • 如果某个 case 匹配后没有 break,程序会继续执行下一个 case 的代码,这被称为 "贯穿" (fall-through),有时这是有意为之的设计,但更多时候是忘记写 break 导致的逻辑错误。
  4. default 分支

    • 可选的,当 expression 的值与任何一个 case 都不匹配时,会执行 default 后面的代码。
    • default 的位置是灵活的,但通常放在最后。

示例

示例 1:基本用法(带 break

#include <stdio.h>
int main() {
    int day = 3;
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n"); // 这里的代码会被执行
            break;
        case 4:
            printf("星期四\n");
            break;
        default:
            printf("无效的星期\n");
            break;
    }
    return 0;
}
// 输出: 星期三

示例 2:break 的缺失("贯穿" 效果)

#include <stdio.h>
int main() {
    int grade = 'B'; // 字符 'B' 在 C 中会被当作整数处理
    switch (grade) {
        case 'A':
            printf("优秀!\n");
            break;
        case 'B':
        case 'C':
            // 当 grade 是 'B' 或 'C' 时,都会执行这里的代码
            printf("良好!\n");
            break;
        case 'D':
            printf("及格.\n");
            break;
        default:
            printf("不及格.\n");
            break;
    }
    return 0;
}
// 输出: 良好!

C 语言中的循环

C 语言提供了三种主要的循环结构:for 循环、while 循环和 do-while 循环。

for 循环

当你知道循环需要执行确切次数时,for 循环是最常用的。

语法:

for (初始化表达式; 循环条件; 更新表达式) {
    // 循环体
}
  • 初始化表达式:在循环开始前执行一次,通常用于初始化计数器变量。
  • 循环条件:在每次循环开始前检查,如果为真(非零),则执行循环体;如果为假(零),则循环结束。
  • 更新表达式:在每次循环体执行完毕后执行,通常用于更新计数器。

示例:打印 1 到 5

#include <stdio.h>
int main() {
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    // 输出: 1 2 3 4 5
    return 0;
}

while 循环

当你希望在某个条件为真时持续循环,但不确定具体次数时,使用 while 循环。

语法:

while (循环条件) {
    // 循环体
}
  • 先检查条件,如果为真,则执行循环体,如果条件一开始就为假,循环体一次都不会执行。

示例:猜数字游戏(简化版)

#include <stdio.h>
int main() {
    int secret_number = 7;
    int guess = 0;
    printf("猜一个 1 到 10 之间的数字: ");
    while (guess != secret_number) {
        scanf("%d", &guess);
        if (guess < secret_number) {
            printf("太小了,再试一次: ");
        } else if (guess > secret_number) {
            printf("太大了,再试一次: ");
        }
    }
    printf("恭喜你,猜对了!\n");
    return 0;
}

do-while 循环

do-while 循环与 while 循环非常相似,不同之处在于它至少会执行一次循环体,因为它是先执行循环体,然后再检查条件。

语法:

do {
    // 循环体
} while (循环条件);
  • 注意最后的分号 是必须的。

示例:确保用户输入有效

#include <stdio.h>
int main() {
    int number;
    char choice;
    do {
        do {
            printf("请输入一个正整数: ");
            scanf("%d", &number);
        } while (number <= 0); // 如果输入无效,会一直循环,直到输入正数
        printf("你输入的数字是 %d,\n", number);
        printf("是否继续? (y/n): ");
        scanf(" %c", &choice); // 注意 %c 前的空格,用于消耗换行符
    } while (choice == 'y' || choice == 'Y');
    printf("程序结束,\n");
    return 0;
}

switch 和 循环 的组合使用

这是 switch 和循环最常见和强大的应用场景,一个循环作为程序的主菜单,而 switch 根据用户的选择来调用不同的功能函数。

示例:一个简单的计算器程序

这个程序会一直运行,直到用户选择退出。

#include <stdio.h>
// 函数声明
void add();
void subtract();
void multiply();
void divide();
int main() {
    int choice;
    // 使用一个无限循环,直到用户主动退出
    while (1) {
        // 打印菜单
        printf("\n--- 简单计算器 ---\n");
        printf("1. 加法\n");
        printf("2. 减法\n");
        printf("3. 乘法\n");
        printf("4. 除法\n");
        printf("0. 退出\n");
        printf("请输入你的选择 (0-4): ");
        // 读取用户选择
        scanf("%d", &choice);
        // 使用 switch 来处理用户的选择
        switch (choice) {
            case 1:
                add();
                break;
            case 2:
                subtract();
                break;
            case 3:
                multiply();
                break;
            case 4:
                divide();
                break;
            case 0:
                printf("感谢使用,再见!\n");
                // 使用 break 跳出 switch,然后循环条件 (1) 为假,退出 while 循环
                // 更优雅的退出方式是 return 0;
                return 0; 
            default:
                printf("无效的选择,请输入 0 到 4 之间的数字,\n");
                break;
        }
    }
    return 0;
}
// 函数定义
void add() {
    double a, b;
    printf("请输入两个数字: ");
    scanf("%lf %lf", &a, &b);
    printf("结果是: %.2lf\n", a + b);
}
void subtract() {
    double a, b;
    printf("请输入两个数字: ");
    scanf("%lf %lf", &a, &b);
    printf("结果是: %.2lf\n", a - b);
}
void multiply() {
    double a, b;
    printf("请输入两个数字: ");
    scanf("%lf %lf", &a, &b);
    printf("结果是: %.2lf\n", a * b);
}
void divide() {
    double a, b;
    printf("请输入两个数字: ");
    scanf("%lf %lf", &a, &b);
    if (b == 0) {
        printf("错误:除数不能为零!\n");
    } else {
        printf("结果是: %.2lf\n", a / b);
    }
}
特性 switch 语句 循环语句 (for, while, do-while)
目的 多路分支选择 重复执行
控制 基于一个整型表达式的值 基于一个布尔条件
执行 只执行一个匹配的分支 重复执行循环体,直到条件为假
组合 经常与循环(如 while)结合,构成主菜单驱动的程序 可以嵌套 switch 语句,但较少见

理解 switch 和循环各自的特性以及它们如何协同工作,是编写结构清晰、逻辑复杂的 C 语言程序的关键。

-- 展开阅读全文 --
头像
dede tagindex如何正确配置与使用?
« 上一篇 今天
dede typelink如何实现调用与自定义?
下一篇 » 今天

相关文章

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

目录[+]