本文目录导读:
- 基本语法
- 快速上手:一个简单例子
- break
?">为什么每个 case 后面都要加
break- ?
- default
的位置">
default- 的位置
- switch 可以嵌套吗?
- switch 与 if-else 的选择
- 常见陷阱与注意事项
- 完整的进阶示例:简易计算器
在C语言编程中,我们经常需要根据一个变量的不同值来执行不同的代码块,虽然可以用
if-else if-else链实现,但当判断条件较多时,代码会变得冗长且难以阅读,这时,
switch语句就成为了更好的选择——它让多分支选择逻辑更加清晰、高效。
语句就成为了更好的选择——它让多分支选择逻辑更加清晰、高效。
C语言中的
switch语句到底怎么用?有哪些容易踩的坑?本文将带你一步步掌握它。
语句到底怎么用?有哪些容易踩的坑?本文将带你一步步掌握它。
基本语法
switch语句的结构如下:
语句的结构如下:
switch (表达式)
{
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
...
default:
默认语句块;
}
关键点:
表达式必须是一个整型或字符型(char、int、short、long、enum 等),不能是浮点数或字符串。
- 必须是一个整型或字符型(char、int、short、long、enum 等),不能是浮点数或字符串。
- 后面跟的必须是常量表达式(如数字、字符、枚举常量),不能是变量或范围。
- 块(不写会“穿透”到下一个 case,后面会详细讲)。
- 是可选的,当所有 case 都不匹配时执行。
case后面跟的必须是常量表达式(如数字、字符、枚举常量),不能是变量或范围。
break用于跳出整个
switch块(不写会“穿透”到下一个 case,后面会详细讲)。
default是可选的,当所有 case 都不匹配时执行。
快速上手:一个简单例子
假设我们要根据用户输入的数字(1~7)输出对应的星期:
#include <stdio.h>
int main() {
int day;
printf("请输入数字(1-7):");
scanf("%d", &day);
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:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("输入错误,请输1~7之间的数字\n");
}
return 0;
}
运行效果:
请输入数字(1-7):5星期五
如果输入 8,就会输出
输入错误,请输1~7之间的数字。
。
为什么每个 case 后面都要加
break?
?
这是初学者最容易忽略的问题。
break用来跳出 switch 块,如果没有
break,程序会继续执行下一个 case 的代码,直到遇到
break或 switch 结束,这种行为称为“穿透”(fall-through)。
或 switch 结束,这种行为称为“穿透”(fall-through)。
1 不加 break 的例子
int n = 2;
switch (n)
{
case 1:
printf("one\n");
case 2:
printf("two\n");
case 3:
printf("three\n");
default:
printf("default\n");
}
输出:
twothree
default
为什么?因为
n==2匹配了
case 2,但后面没有
break,程序就顺着执行了
case 3和
default的代码,直到 switch 结束。
的代码,直到 switch 结束。
2 利用穿透:合并多个 case
有时候我们故意利用穿透来让多个 case 执行同一段代码,判断月份天数(不考虑闰年):
int month = 2;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("31天\n");
break;
case 4:
case 6:
case 9:
case 11:
printf("30天\n");
break;
case 2:
printf("28天\n");
break;
default:
printf("无效月份\n");
}
这里
case 1、
case 3…… 都没有写
break,它们会依次“穿透”到第一个有
break的
case处(即
case 12后面的
break),从而共用打印“31天”的代码。
),从而共用打印“31天”的代码。
default的位置
的位置
default习惯放在最后,但它其实可以放在 switch 块的任何位置。
习惯放在最后,但它其实可以放在 switch 块的任何位置。
int color = 0;
switch (color)
{
default:
printf("未知颜色\n");
break;
case 0:
printf("红色\n");
break;
case 1:
printf("绿色\n");
break;
}
当
color==0时,不会进入
default,直接匹配
case 0。
default放在中间且没有
break,也会发生穿透,但为了可读性,推荐将
default放在最后,并加上
break。
。
switch 可以嵌套吗?
可以。
switch内部当然可以再嵌套另一个
switch,但要注意代码的可读性,过多的嵌套会让程序变得混乱,一般建议用函数或
if-else重构。
重构。
switch 与 if-else 的选择
场景 推荐用 switch 推荐用 if-else 变量值与若干整型/字符常量比较 也可以,但更长 需要判断范围(如 age > 18) ❌ 不支持 需要判断浮点数或字符串 ❌ 不支持 判断条件数量多(如10个以上) ✅ 更清晰 ❌ 可能冗长 需要复杂的逻辑组合(与、或、非) ❌ 不支持 ) ❌ 不支持 需要判断浮点数或字符串 ❌ 不支持 判断条件数量多(如10个以上) ✅ 更清晰 ❌ 可能冗长 需要复杂的逻辑组合(与、或、非) ❌ 不支持 当判断基于一个整型变量的离散值时,switch 更优;涉及范围、浮点、字符串或复杂条件时,用 if-else。
常见陷阱与注意事项
case 后必须是常量
case x:中的 x 不能是变量,不能是表达式(如
a + b),必须是编译期可确定的常量。
),必须是编译期可确定的常量。
避免遗漏 break
没有 break 会导致意外穿透,调试时可能很难发现,建议每个 case 后面都写 break,除非你有意利用穿透。
不要忘记 default
即使你认为所有情况都已覆盖,也建议加上
default来处理意外值,能提高程序的健壮性。
来处理意外值,能提高程序的健壮性。
多个 case 可以共享一个值吗?
不可以,C 标准不允许同一个 switch 中出现两个相同的 case 常量。
switch 表达式类型
必须是整数类型(包括 char 和 enum),注意:
char实际上是一个小整数,可以用在 switch 中。
实际上是一个小整数,可以用在 switch 中。
完整的进阶示例:简易计算器
用 switch 实现一个计算器(支持 +、-、*、/):
#include <stdio.h>
int main() {
char op;
double a, b, result;
printf("请输入表达式 (如 3 + 5):");
scanf("%lf %c %lf", &a, &op, &b);
switch (op)
{
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b != 0)
result = a / b;
else
{
printf("错误:除数不能为0\n");
return 1;
}
break;
default:
printf("不支持的运算符\n");
return 1;
}
printf("%.2f %c %.2f = %.2f\n", a, op, b, result);
return 0;
}
switch是多分支选择的利器,让代码更整洁。
- 是多分支选择的利器,让代码更整洁。
- 每个
- ,除非你想利用“穿透”。
- 处理意外的值,建议总是写上。
- 后的值必须是整型常量。
- 浮点数和字符串不能用
- 。
case后一般要加
break,除非你想利用“穿透”。
default处理意外的值,建议总是写上。
case后的值必须是整型常量。
switch,请使用
if-else。
掌握
switch语句,你就能写出更清晰、更高效的 C 语言代码,打开你的编辑器,试试用
switch重写一个之前用
if-else写的多分支程序吧!
写的多分支程序吧!
- THE END -
