C语言的switch语句

C语言还提供了另一种用于多分支选择的 switch 语句, 其一般形式为:

switch(表达式){
case 常量表达式 1: 语句 1;
case 常量表达式 2: 语句 2;
…
case 常量表达式 n: 语句 n;
default : 语句 n+1;
}

比如:

switch (a){
case 1:printf("Monday\n");
case 2:printf("Tuesday\n");
case 3:printf("Wednesday\n");
case 4:printf("Thursday\n");
case 5:printf("Friday\n");
case 6:printf("Sa urday\n");
case 7:printf("Sunday\n");
default:printf("error\n");
}

本程序是要求输入一个数字,输出一个英文单词。但是当输入 3 之后,却执行了 case3 以及以后的所有语句,输出了 Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch 语句的一个特点。在 switch 语句中, “case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个 switch 语句,所以出现了继续执行所有后面 case 语句的情况。 这是与前面介绍的 if 语句完全不同的,应特别注意。为了避免上述情况,C 语言还提供了一种 break 语句,专用于跳出 switch 语句, break 语句只有关键

<think>嗯,用户想了解C语言switch语句的用法和示例。我先回忆一下自己学过的知识。首先,switch语句是一种多分支选择结构,通常用来替代多个if-else的情况,让代码更清晰。记得它的基本结构是switch后面跟表达式,然后case不同的常量值,每个case后面跟执行语句,还有break来结束当前case。 对了,用户提供的引用资料里提到,如果没有break的话,会继续执行后面的case语句,这叫做“穿透”现象。比如,如果case 1后面没有break,执行完case 1的代码后,会接着执行case 2的语句,直到遇到break或者switch结束。这可能是有意设计的,但也容易出错,所以需要特别注意。 然后,default分支是可选的,当所有case都不匹配时执行。这在处理意外输入时很有用,可以给出错误提示或者默认操作。比如用户输入了不在预期范围内的选项,default就会处理这种情况。 接下来,用户可能需要一些具体的例子来理解。比如,用switch语句处理菜单选择,或者根据成绩等级输出评语。还有,可能需要注意case后面的常量必须是整型或字符型,不能是变量或者表达式。例如,case 1+2是可以的,但case a就不行,除非a是常量。 另外,用户的问题可能涉及到常见的错误,比如忘记写break导致意外的穿透,或者case的值重复。这时候需要提醒用户检查每个case是否有break,以及常量是否唯一。 还有,用户可能想知道switch和if-else的区别,什么时候用哪个更合适。一般来说,当有多个固定的值需要判断时,switch更简洁;而条件比较复杂,比如范围判断时,if-else更合适。 在示例代码方面,可以举一个简单的数字转换星期几的例子,或者计算器程序中的加减乘除操作。每个case处理不同的运算符,并输出结果。同时,加入break来防止穿透,最后用default处理无效输入。 另外,用户可能对case的穿透有疑问,可以举一个例子,比如多个case共享同一段代码的情况。比如,case 1、case 2都执行相同的语句,这时可以不用break,让它们穿透到同一个处理块。 最后,总结一下注意事项:break的重要性,case常量的类型,default的使用场景,以及穿透现象的应用和避免。这样用户就能全面了解switch的用法和常见问题。</think>### C语言switch语句详解 #### 一、基本语法结构 switch语句是C语言中实现多分支选择的核心结构,语法格式为: ```c switch(表达式) { case 常量1: 语句块1; break; case 常量2: 语句块2; break; // ... default: 默认语句块; } ``` - 表达式必须是整型或字符型 - case后必须接整型常量表达式 - break用于终止当前case的执行流程[^2] #### 二、执行流程图解 $$流程图: \begin{array}{ccc} \text{表达式求值} & \rightarrow & \text{匹配case常量} \\ \downarrow & \nwarrow & \\ \text{执行对应语句块} & \leftarrow & \text{break中断} \end{array} $$ #### 三、关键特性说明 1. **穿透现象**:当case后缺少break时,会继续执行后续case语句直到遇到break或语句结束[^3] ```c switch(n) { case 1: printf("A"); case 2: printf("B"); // n=1时会输出AB break; } ``` 2. **常量匹配规则**:case后的值必须是编译期可确定的整型常量 ```c #define MAX 10 switch(x) { case MAX-5: // 合法 case y: // 非法(除非y是const常量) } ``` #### 四、完整应用示例 ```c #include <stdio.h> int main() { char grade = 'B'; switch(grade) { case 'A': printf("优秀\n"); break; case 'B': printf("良好\n"); break; case 'C': printf("及格\n"); break; default: printf("无效成绩\n"); } return 0; } ``` 输出结果:`良好` #### 五、使用注意事项 1. 每个case建议以break结尾,除非需要故意利用穿透特性 2. case标签的值必须唯一 3. default分支可以放在任意位置,但通常置于最后 4. switch嵌套时注意作用域问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值