我们在前面已经说过了分支结构中的if语句,今天我们再来介绍C语言中的最后一种分支语句:switch。这个switch和前面的if将有一些不同之处,请大家一定要注意噢。
switch
这是一种特殊形式的if……else结构,用于判断条件有多个结果的情况,将之前的else if变得更简单、易用、可读性更好的形式。
switch(expression)
{
case value1:statement
case value2:statement
default:statement
}
上面代码中,根据switch后面括号中的表达式expression不同的值,执行相应的case分支,而value1和value2代表的就是整型常量表达式,如果switch后面括号中的表达式结果就不是case后面的整型常量表达式,则执行default分支。
也就是说,如果switch()里面的表达式结果可以和case后面的值相对应,则从那个case一一往下执行,直到default,然后退出。
举个例子:我们用手机充电器一般更喜欢用手机原本自带的充电器,因为用的可以和手机插口对应上,只要用上那个原本的充电器便一直使用,直到找不到了,然后使用替换的充电器,所以default在这里面就是一个替代品。case和default只会执行其中一种。
划重点了!!!
switch后的expression必须是整型表达式,如2+1,5-2,'b'-'a','9'-'7',
case后的值,必须是整型常量表达式,如5,4
这里可能会有疑问,为什么英文也可以是整型表达式。而且数字也加了单引号,因为这里用到了字符,给一个字母或数字加上单引号(‘’)之后,它便是一个字符,而字符在计算机中的数据是以ASCII编码存储的,如果有需要,可以移步我们第一节的内容。
https://blog.csdn.net/zjajaaa/article/details/133952058
所以当字符之间运算时,它便是ASCII编码之间的运算,即字符之间的运算表达式也是整型表达式。
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");
else
printf("余数是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 0
每一个case语句中的代码执行完成后,需要加上break,才能跳出这个switch
上面代码中,如果n=3,则3%3,得0,然后输出case 0下的“整除,余数为0”,然后由于break的原因,使得当前代码提前结束,否则便会执行到最后。
我们可以再来详细介绍一下,如果没有break,会发生什么呢?
switch语句中的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;
}
结果:
3
整除,余数为0
余数是1
余数是2
当我们输入3之后,3%3结果为0,然后先执行第一个case,然后逐个开始往下执行,直到结束。所以由此可见switch语句也有分支效果,当我们想要在switch执行过程中退出该语句,就需要在想要停止的case后面加一个break,就如同上面的两串代码。
所以switch语句中break是非常重要的。能实现真正的分支效果。
难道每个switch都要用到break吗?这就要根据实际情况来看了。
例如:
练习:
输⼊⼀个1~7的数字,打印对应的星期⼏
例如:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊:7 输出:星期天
#include <stdio.h>
int main()
{
int day = 0;
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 = 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;
}
return 0;
}
这时候,就有人要问了,如果输入8呢,输入9呢?
这时候,我们就要用到我们刚刚提到的替代品default了。
我们将default加入上面的代码,我们可以这样进行:
#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;
}
如果我们输入的不是1~7,便会执行default语句,然后结束。
最后我们可以看到我们上面的代码都是整整齐齐的从case 1 到case 7 ,再到default,可能有人又问了,这个代码是对这个格式有要求吗?
其实是没有的,case 5 也可以在case 1上面,default也可以在case 1上面,不会影响代码的运行过程。上面这样写,是为了代码的美观和方便自己阅读。毕竟谁都不希望自己写的代码乱七八糟的……
今天的内容到这里就结束了,如果各位有什么疑问,可以在评论区留言或者私信噢。