switch语句-default子句

一转眼就大三了,发现自己的基础和实践能力比较差,正好学弟最近在学C语言,问题也比较多,借此机会就来重温一下C语言吧!


前言

最近一直在帮学弟学习C语言,发现了一些之前没有关注到的知识点。温故而知新~准备借此机会再重新复习一遍C语言,期待会有更多新的收获。
本次的内容是对Switch语句的default子句的使用
C语言提供了一种用于多分支选择的switch语句,其一般形式为:

switch(表达式)
{
	case 常量表达式1:语句组1case 常量表达式2:语句组2case 常量表达式3:语句组3...
	case 常量表达式n:语句组n;
	default:语句组 n+1//可以放在任意位置
}

一、引出问题

学弟问的是这个程序的结果为什么是

error
good
#include<stdio.h>
void main()
{
	int n='e';
	switch(n--){
	default:printf("error\n");
	case 'a':
	case 'b':printf("good\n");break;
	case 'd':printf("warn\n");
	case 'c':printf("pass\n");
	}
}

二、问题分析及解答

在这个程序中可以看到default子句不在Switch语句块的最后一行,且仅在第二个case子句中有break,所以其执行顺序会与以往的不同。

1、switch语句执行顺序

switch语句的执行过程如下:
先计算switch后的表达式的值,然后与第一个case后面的常量表达式1的值进行比较:
如果相同,就执行语句组1 (语句组1后如果有break语句,就退出switch语句,继续执行switch语句后的语句;语句组1后如果没有break语句,继续执行下一个case后的语句组2 ;依次类推······);如果不同,再拿switch后的表达式的值与第二个case后面的常量表达式2的值相比:如果相同,就执行语句组2(同上面括号内) ;依次类推······如果找不到匹配的case值则执行default语句,如果找不到匹配的case值且不存在默认语句(default),则跳过switch语句体,什么也不做。

2、对switch语句的说明

说明:
(1)switch后面的“表达式”,可以是int、char和枚举型中的一种。
(2)每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。
(3)case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,必要时加上break语句,以便结束switch语句。
(4)若每个分支后都有break 语句,则各case 及default子句的先后次序,不影响程序执行结果。
(5)多个case子句,可共用同一语句(组)。
(6)用switch 语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。

3、对问题的解答及感悟

1)n--就是先赋值再减减,以后不会有疑问
2)switch语句先执行case语句,若能匹配,则从该case语句开始执行,直至出现break或者执行到switch语句的最后一条语句
3)若不能匹配则开始从default语句开始执行,直至出现break或者执行到switch语句的最后一条语句
4)case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,必要时加上break语句,以便结束switch语句。
5)default语句可以放到任意位置
6)若每个分支后都有break语句,则各case及default子句的先后次序,不影响程序执行机构。

总结

以上就是今天要讲的内容,本文就通过一道题目发现对switch语句认识的不足,重点在于default子句位置及break的使用。
若有匹配的case值,则从该case语句开始执行,直至出现break或者执行到switch语句的最后一条语句
若没有匹配的case值,且有default子句,则开始从default语句开始执行,直至出现break或者执行到switch语句的最后一条语句
若没有匹配的case值,也没有default子句,则跳过switch语句体,什么也不做

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋向上_UP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值