目录
一、switch语句基础
基本语法结构:
在C/C++中:
注意事项:
二、if与switch语句对比
示例:计算整数除以3的余数
使用if语句实现:
使用switch语句实现:
三、break语句的作用
示例(无break的情况):
练习:输入1-7的数字,输出对应的星期名称
参考代码:
需求变更后:
修改后的参考代码:
四、default子句
五、注意事项
一、switch语句基础
除了if语句外,C语言还提供了switch语句来实现分支结构。switch语句是一种特殊形式的if-else结构,专门用于处理多条件分支的情况,它能够将复杂的else-if结构转换为更易用、可读性更好的形式。
基本语法结构:
switch (expression) {case value1: statement1;break;case value2: statement2;break;...default: default_statement;break;
}
上述代码根据 expression 的不同取值执行对应的 case 分支。若未匹配到任何值,则执行 default 分支。
在大多数编程语言中,switch
语句的 case
标签右边的值(value)通常是 整型(int) 或可以隐式转换为整型的类型(如 char
、enum
),但具体规则取决于语言。
在C/C++中:
-
case
值必须是整型常量表达式(如int
、char
、enum
)。 -
字符类型(char)也是归类到整型家族,因为字符的本质ASCII码值,这个值是整数。
-
不允许字符串、浮点数或变量(C++11 后允许
constexpr
)。switch (x) {case 1: // 合法(整型)case 'a': // 合法(char 隐式转 int)case ENUM_VAL: // 合法(enum 隐式转 int)// case 1.5: // 非法(浮点数)break; }
注意事项:
-
switch
后的表达式(expression)必须是整型表达式 -
case
后的值必须是整型常量表达式 -
case
和值之间必须有空格 -
每个
case
语句执行完毕后通常需要添加break
以跳出switch结构
二、if与switch语句对比
示例:计算整数除以3的余数
使用if语句实现:
#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);if(n%3 == 0)printf("整除,余数为0\n");else if(n%3 == 1)printf("余数是1\n");elseprintf("余数是2\n");return 0;
}
使用switch语句实现:
#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余数为0\n"); break;case 1:printf("余数是1\n"); break;case 2:printf("余数是2\n"); break;}return 0;
}
在编写代码时,需要注意以下关键点:
- case关键字与后续数字之间必须保留空格
- 每个case语句块执行完毕后,必须添加break语句才能正确退出switch结构
三、break语句的作用
在switch语句中,break
用于终止当前case的执行并跳出整个switch结构。如果省略break,程序会继续执行下一个case中的语句,这种现象称为"case穿透"。
示例(无break的情况):
#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余数为0\n"); case 1:printf("余数是1\n"); case 2:printf("余数是2\n"); }return 0;
}
当输入7时(7%3=1),输出将是:
我们发现程序在计算7除以3时,本该显示余数为1,但运行结果却多输出了"余数是2"的信息。这到底是什么原因呢?
问题出在switch语句的分支机制上。switch语句需要配合break才能实现真正的分支效果。当某个case语句后缺少break时,程序会继续向下执行,可能进入其他case的代码块,直到遇到break或switch语句结束。例如在上述代码中,程序就意外执行了case 2的语句。
因此,在switch语句中合理使用break至关重要,它能确保正确的分支控制。不过需要注意的是,并非每个case都必须包含break,这需要根据具体业务逻辑来决定。
练习:输入1-7的数字,输出对应的星期名称
示例: 输入1 → 输出"星期一" ;输入2 → 输出"星期二" ;输入3 → 输出"星期三" ;输入4 → 输出"星期四" ;输入5 → 输出"星期五" ;输入6 → 输出"星期六" ;输入7 → 输出"星期天"
参考代码:
#include <stdio.h>
int main() {int day;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;}return 0;
}
需求变更后:
- 输入1-5时输出"工作日"
- 输入6-7时输出"休息日"
修改后的参考代码:
#include <stdio.h>
int main() {int day;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5: printf("工作日\n"); break;case 6:case 7: printf("休息日\n"); break;}return 0;
}
通过这个练习可以看出,在实际编码时需要根据具体需求来决定break语句的使用位置,这样才能正确实现功能需求。
四、default子句
当switch表达式的值与所有case都不匹配时,会执行default子句中的代码。default不是必须的,但建议总是包含它以处理意外情况。
switch (expression)
{
case value1:statement;break;
case value2:statement;break;
default:statement;
}
当 expression 的值既不是 value1 也不是 value2 时,程序将执行 default 子句中的代码。
比如之前的打印星期练习,当输入的 day 值不在1到7范围内时,若要提示"输入错误",可以这样编写代码:
#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:printf("星期一\n");break;// ... 其他星期 ...case 7:printf("星期天\n");break;default:printf("输入错误,请输入1-7的数字\n");break;}return 0;
}
工作日与休息日判断:
#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;default:printf("输入错误\n");break;}return 0;
}
五、注意事项
-
case和default的顺序可以任意排列,但通常将default放在最后
-
case穿透有时是有意为之(如上面的工作日示例),但大多数情况下需要添加break
-
switch语句只能处理离散的整数值,不能处理范围判断(如x > 10)
-
多个case可以共享同一组执行语句
通过合理使用switch语句,可以使多分支结构的代码更加清晰、易于维护。