[简明C语言]分支和循环P_2:分支 - swtich语句


前言

第二章:分支和循环

分支语句,也叫条件判断语句。
switch语句从字面上讲,可以称为开关语句,当然理解上不要以为就只有开和关,可以想象它是一个多路开关。它是一种多分支结构。

比如:

输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期七

用if…else if…else if的形式的表达太过复杂,所以要使用一种不一样的语法形式。这就是switch语句。


swtich语句

switch语句是一种流控制语句,用于多种选择判断。当表达式值等于所设置值的时候则执行后面的语句。可用break关键字跳出switch语句。

用一段伪代码来描述模块结构图:

switch(整型表达式)
{
	语句项;
}

语句项

语句项是什么呢?

//是一些case语句:
//如下:
case 整型常量表达式;
	语句;

那么给定语句项,下面这段代码会输出什么呢?

#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)//整型表达式
	{
	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");
	//没有break语句
	}
	return 0;
}

当输入值为1时,来看看运行结果:
运行结果
可以发现当输入1的时候,打印出的结果却是全部的case

这是因为在case1输出后,没有什么阻止它停下时,就会一直向后输出,直到输出所有case语句。

输入值改为2呢?
运行结果
可以发现当输入2的时候,打印出了从星期二开始向后的所有case

所以决定入口的,是表达式和case后的值。

如果想要达到预期的分支效果,也就是输入什么,就输出对应的选项,那么应该怎么做呢?

break语句

在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支:

#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;
}

运行结果:
运行结果
case决定入口,break决定出口。

每个case后加入了break语句后,当输入3时,打印的结果为星期三,达到了预期的效果。

但是,不是每一个case后面都需要break,上述例子中需要加入break只是需要符合逻辑

这样就实现了真正的分支

多个case值对应一个执行语句

如果想要输入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;
}

当输入4的时候,运行结果为工作日:
运行结果
可以看出,case后是否加break并不是语法规定的,而是根据自身的需求来的。

注:最后一个case也要添加break
     【编程好习惯】
       这样写可以避免在以前的一个case语句后面继续编写时,忘了添加break语句的情况。

如果一个没有规定的未知字符被传递给这条switch语句,会出现什么情况呢?

对上述例子输入9,运行结果:
无输出
可以看到当输入9时,程序没有任何输出。为了获得反馈,在此加入一个default子句,以处理这种情况。

default子句

表达的值与所有的case标签的值都不匹配时,所有的语句都被跳过。

程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。

但是,如果并不想忽略不匹配所有标签的表达式的值时该怎么办呢?

可以在语句列表中增加一条default子句

switch语句是一个条件选择语句,首先会找到满足条件的case值做为执行后面的程序入口;若所有的case都不满足,则找default入口,若未找到则退出整个switch语句;所以default只是一个备用的入口,有没有都无所谓。

为了进行错误检查或逻辑检查,还是应该在switch语句中加入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;
}

此时输入9,运行结果为:
运行结果
此时打印出了“输入错误”,对检查到的错误给出了一个反馈。

注:default子句可以放在任何一个case标签可以出现的位置。
语句流会像执行一个case标签一样执行default子句
一般默认放在最后。

注:最好在每个switch语句中都放一条default子句!甚至可以在后边再加一个break!
     【编程好习惯】
       这样写可以给逻辑检查带来很多方便。

要求整型

1. swtich后要求输入一个整型表达式

  • 如果想放一个浮点型会怎样呢?
    报错
    会报错!
    表达式必须包含整型

2. case后要求输入一个整型常量表达式

  • 如果想放一个浮点型会怎样呢?
    报错
    也会报错!
    表达式必须为整型表达式!

  • 如果想放一个变量会怎样呢?
    报错
    还是会报错!
    表达式必须含有常量值

注:字符型是整型的一种。
字符对应的整数由ASCII码值规定。

练习一:嵌套switch语句

以下代码的运行结果是什么?

#include <stdio.h>

int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)//switch允许嵌套使用
		{
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);
	return 0;
}

运行结果为:
运行结果
m = 5,n = 3是怎么得到的呢?

观看注释:

#include <stdio.h>

int main()
{
	int n = 1;
	int m = 2;
	switch (n)//n的值是1,执行case1
	{
	case 1://从case1进入
		m++;//m = 3
	//没有break!!继续执行case2
	case 2:
		n++;//n = 2
	//没有break!!继续执行case3
	case 3://进入嵌套switch语句
		switch (n)//n的值是2,执行case2
		{
		case 1://case1不执行
			n++;
		case 2://从case2进入
			m++;//m = 4
			n++;//n = 3
			break;//此处的break跳出【嵌套的switch语句】!!
		}
	//跳出【嵌套的switch语句】后,继续执行case4
	case 4:
		m++;//m = 5
		break;//跳出【外部的switch语句】
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);//m = 5, n = 3
	return 0;
}

break跳出的只是自己所在的switch语句!

总结

本文详细介绍了分支语句中的switch语句,对分支语句有一个更细致的了解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

H3T

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

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

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

打赏作者

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

抵扣说明:

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

余额充值