计算机小白的成长历程——分支与循环(2)

大家好,很高兴又能和你们见面!上一篇内容,作为分支与循环的开篇,首先介绍了三种结构:顺序、分支、循环,然后解释了什么是语句——由“;”隔开的就是一条语句,最后花了大量的篇幅对第一个分支语句——if语句的知识点做了补充,我自己也在此篇章中学到了在初识C语言的篇章中未学到的知识点。下面我们将开始介绍今天的主角——switch语句。

Switch语句:switch语句也是一种分支语句,常用于多分支的情况。

在上一篇中我们在介绍if语句时提到了多分支的if语句if……else if……else if……else,大家也能在上一篇的内容感受到,为了写完多分支的情况,常常会写一大堆带码,这种形式太复杂了,为了使多分支语句简单化,这时我们就得有不一样的语法形式——switch语句。

代码语言:javascript
复制
//switch语句的语句结构
switch (整型表达式)
{
	case 整型常量表达式:
		语句;
}

这里我们来用一个例子说明这个语句结构;

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int a = 0;
scanf("%d", &a);
//打印一周七天的对应名称
switch (a)
{
case 1:
printf("礼拜一\n");
case 2:
printf("礼拜二\n");
case 3:
printf("礼拜三\n");
case 4:
printf("礼拜四\n");
case 5:
printf("礼拜五\n");
case 6:
printf("礼拜六\n");
case 7:
printf("礼拜天\n");
}
return 0;
}

这段代码的意思是输入一个数并将此数赋值给变量a,判断整型变量a,当a为1时打印礼拜一,当a为2时打印礼拜二……,下面我们输入2,看是否能将礼拜二打印出来:

计算机小白的成长历程——分支与循环(2)if语句

这里我们可以看到,我们在输入2之后不仅礼拜二被打印出来了,而且礼拜三到礼拜天都被打印出来了,这并不是我们需要的结果,我们应该怎样去修改呢?

1.switch语句中的break:

不知道大家对if语句中的总结还有没有印象,在多分支if语句中,如果我们想省略else,那我们应该在执行语句中加入转向语句,在if语句中我们尝试着加入了return 0,结果成功省略了else,那这里我们要加入什么呢?我就不卖关子了,在switch语句中,我们在case的执行语句中应该加入一个break——终止、停止,这样我们就能让语句的每一项分支给独立起来,如下图所示:

计算机小白的成长历程——分支与循环(2)#include_02

这里大家就可以看到,我们在输入3后,它只打印了我们需要的礼拜三,这里我们可以总结一下switch语句的完整结构:

代码语言:javascript
复制
//switch语句结构
switch (整型表达式)
{
case 整型常量表达式:
语句;
break;
}

我们在使用的时候,有几种情况,那我们就可以写几种case,下面我买来试一下将15的结果都打印成工作日,将67的结果都打印成休息日,我们来编写一下代码:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int a;
scanf("%d", &a);
switch (a)
{
case 1:
printf("工作日");
break;
case 2:
printf("工作日");
break;
case 3:
printf("工作日");
break;
case 4:
printf("工作日");
break;
case 5:
printf("工作日");
break;
case 6:
printf("休息日");
break;
case 7:
printf("休息日");
break;
}
return 0;
}

按照上面的格式,咱们编写出来是这样的代码,但是这时我们来思考一个问题,它们这样写与if……else if……else的写法有区别吗?前面我们也提到了switch语句是为了简化多分支语句的一种新的语法形式,但是像这样的话,并没有起到简化的作用呀。大家都有看到,在switch语句中情况15的执行语句是相同的,情况67的执行语句是相同的,那我们不妨来尝试一下将这些语句给合并起来:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int a;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
}
return 0;
}

简化之后代码就简洁了很多,此时代码的含义就变成了判断a在a为15的情况下打印工作日,在a为67的情况下打印休息日,那现在的问题来了,这样编写它能够正常运行吗?我们直接行动起来,分别输入1/3/6/7来进行测试:

计算机小白的成长历程——分支与循环(2)_switch语句_03
计算机小白的成长历程——分支与循环(2)if语句_04
计算机小白的成长历程——分支与循环(2)#include_05
计算机小白的成长历程——分支与循环(2)_switch语句_06

从测试结果咱们可以看到,程序能够很好的运行,我们现在要确定一个问题,if……else if能不能也像这样简化,下面我们来尝试着简化一下:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int a;
scanf("%d", &a);
if (a == 1)
else if (a == 2)
else if (a == 3)
else if (a == 4)
else if (a == 5)
{
printf("工作日");
return 0;
}
else if (a == 6)
else if (a == 7)
{
printf("休息日");
return 0;
}
return 0;
}

接下来我们来运行看看结果如何:

计算机小白的成长历程——分支与循环(2)_#include_07

从这些报错中我们可以看到,if……else if后面是需要输入语句的,也就是说,即使在不同的情况下语句都相同,它还是需要在每一个if、else if后面加入语句,现在从这一点就证明了一件事,switch语句确实是在多分支语句的情况下能够更加简洁。下面我有个问题,既然break在switch语句中能够使用,那我能不能在if语句中使用呢?接下来我们就来测试一下:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if (x > y && y > z)
{
printf("%d>%d>%d\nx>y>z\n", x, y, z);
break;
}
else if (x > z && z > y)
{
printf("%d>%d>%d\nx>z>y\n", x, z, y);
break;
}
else if (y > x && x > z)
{
printf("%d>%d>%d\nx>z>y\n", y, x, z);
break;
}
else if (y > z && z > x)
{
printf("%d>%d>%d\nx>z>y\n", y, z, x);
break;
}
else if (z > x && x > y)
{
printf("%d>%d>%d\nx>z>y\n", z, x, y);
break;
}
printf("%d>%d>%d\nx>z>y\n", z, y, x);
break;
return 0;
}

这一次编写的代码,我们使用了上一篇if语句中提到的知识点,省略else的用法,下面我们来测试一下:

计算机小白的成长历程——分支与循环(2)_#include_08

从报错中我们可以看到,这里描述的是break的使用范围,break只能在循环或者开关中使用,有朋友可能就会问了,这个循环我能理解,是循环语句,这个开关是什么?这里我同样也抱有这个疑问,然后我去查阅了资料,最后得到的结论是switch语句又叫做开关语句,这里的开关就是指的switch语句。接下来我们来对这一部分内容做个小结:

1.在switch语句中switch的判断条件是整型表达式,case的分支条件是整型常量表达式;

2.在多分支语句中switch语句比if语句要更简洁;

3.转向语句break就好比一堵墙,能把switch语句中的不同分支给独立出来,使它们互不干扰;

4.break语句除了可以在开关语句——switch语句中使用,还能在循环语句中使用;

注:我们在写代码的过程中一定要养成case后面加上break的习惯,如果出现了像咱们今天举的例子,多个case执行同一个语句时,我们只需要在最后一个case后面加上break就行。

2.default子句:

有个问题不知道大家有没有考虑过,就是如果我们在switch语句中输入了case情况外的值,又会发生什么呢?没错,它的结果就是什么都不发生,但是大家应该都有过忘记密码的体验,我们在输错密码时系统会提示我们密码错误,我们能不能按照这个逻辑在switch语句中表示出来呢?答案是当然可以,这就是我们要探讨的default子句。

这个default子句就像是另一种形式的case语句,它可以放在任何一个switch语句的代码块中的任何位置,但是它又和case有些区别,case的分支条件是整型常量表达式,default语句是只要不满足case的一切条件。下面我们举例来验证:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
int a;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}

下面我们输入8、a、“.”来测试一下结果:

计算机小白的成长历程——分支与循环(2)if语句_09
计算机小白的成长历程——分支与循环(2)#include_10
计算机小白的成长历程——分支与循环(2)_if语句_11

上述结果证明了,只要我们输入的不是case的分支条件,那default就会被执行,下面我们来验证一下default是不是在switch代码块内可以放在任何位置。

计算机小白的成长历程——分支与循环(2)switch语句_12
计算机小白的成长历程——分支与循环(2)#include_13

通过这次测试,我们也验证了default在switch语句的代码块内可以放在任何位置。

你们说既然default是包括了所有不满足case语句的情况,那我们可不可以写多个default来执行不同的内容呢?我们继续测试:

计算机小白的成长历程——分支与循环(2)_switch语句_14

从这次的报错中我们就能得到结论,在switch语句中,只能出现一个default。下面我们把default相关内容做个总结:

1.default包含了所有的不满足case分支条件的情况;

2.default可以放在switch语句代码块中的任何位置;

3.在switch语句中只能存在一个default。

4.switch语句我们可以写成下面这种结构:

代码语言:javascript
复制
//switch语句结构
switch (整型表达式)
{
case 整型常量表达式:
语句;
break;
default://后面的内容可写可不写,建议养成加上default的好习惯;
语句;
break;
}

现在我们已经把switch语句的内容探讨完了,后面如果有新的内容,我也会第一时间跟大家分享。接下来我们来做一道练习题巩固一下switch语句的相关知识:

代码语言:javascript
复制
//练习题:
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d,n = %d\n", m, n);
return 0;
}

大家可以先笔试算出结果,再进行电脑来验证,在后面的内容中,我会分享这道题目的解析,记得关注哦。

到这里我们就已经把分支语句的内容探讨完了,希望这篇内容能帮助大家更好的去理解switch语句,接下来随着学习的深入,我会继续给大家分享我在学习过程中的感受,感谢大家翻阅,咱们下一篇见。