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

(图片来源网络,侵删)
switch语句:根据一个变量的值,从多个代码块中选择一个来执行,它像是一个多向的岔路口,程序只能选择其中一条路走下去。- 循环语句:用于重复执行一段代码,直到某个条件不再满足,它像一个跑圈,程序会一遍又一遍地绕着同一段路跑。
尽管它们是两种不同的控制流结构,但它们经常组合在一起使用,以实现更复杂的逻辑,通过一个循环来不断接收用户输入,然后使用 switch 来根据输入执行不同的操作。
下面我们分开讲解,最后再讲如何组合使用。
switch 语句详解
switch 语句提供了一种基于变量值进行多路分支的简洁方式。
基本语法
switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时,执行这里的代码
break;
case constant2:
// 当 expression 的值等于 constant2 时,执行这里的代码
break;
// 可以有任意数量的 case
default:
// 当 expression 的值与所有 case 都不匹配时,执行这里的代码
break;
}
关键规则
-
expression(表达式):- 必须是一个整型表达式(
int,char,long,short等)或枚举类型。 - 不能是浮点数(如
float,double)或字符串。
- 必须是一个整型表达式(
-
constant(常量):- 每个
case后面的值必须是常量或常量表达式(如10 + 20),不能是变量。 - 所有
case的值必须是唯一的,不能重复。
- 每个
-
break语句:- 极其重要!
break语句的作用是跳出switch语句。 - 如果某个
case匹配后没有break,程序会继续执行下一个case的代码,这被称为 "贯穿" (fall-through),有时这是有意为之的设计,但更多时候是忘记写break导致的逻辑错误。
- 极其重要!
-
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 语言程序的关键。
