C语言——分支语句(选择结构)

在现实生活中,我们经常会遇到作出选择和判断的时候,在C语言中也同样要面临作出选择和判断的时候,所以今天,就让我们一起来了解一下,C语言是如何作出选择判断的。

目录

1.何为语句?

2.if语句

2.1 if语句的语法结构

2.2 else悬空

2.3 if的书写形式

3.switch语句

3.1 switch的语法结构

3.2 default子句


1.何为语句?

首先,我们要明白什么是语句。在C语言中,语句可以分为以下五类:

表达式语句(比如a = 6;)、函数调用语句(比如printf("%d",a);)、控制语句(分支语句就是其中一种)、复合语句(例如{x = 6;y = 4;z = x + y;printf("%d",z);})、空语句(只有一个分号)。

控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制(C语言支持顺序结构、选择结构和循环结构三种结构)。C语言共有9种控制语句,可大致分为以下三类:

1.分支语句,也叫条件判断语句:if、switch;

2.循环语句:do while语句、while语句、for语句;

3.转向语句:break语句、goto语句、continue语句、return语句。

今天要讲的就是控制语句中的分支语句,也就是if和switch的语法。

话不多说,我们开始吧!

2.if语句

2.1 if语句的语法结构

首先我们了解一下if语句的使用格式:

if (表达式)
		语句1;
	else
		语句2;
	//多分支
	if (表达式1)
		语句1;
	else if (表达式2)
		语句2;
	else
		语句3;
	return 0;

表达式的结果为真,则语句执行,在C语言中,0为假,非0即真。

现在我们来演示一下,实现对年龄的判断,18岁及以上就打印"成年人",18岁以下就打印"未成年",小于0则提示"输入有误"。具体代码如下:

#include<stdio.h>
//代码1
int main()
{
    //定义一个名为age的整型变量,
	int age = 0;
    //输入年龄
	scanf("%d", &age);
    //开始判断
	if (age >= 18)
		printf("成年人");
	else if (age < 0)
		printf("输入有误");
    //不是>=18也不是<0,那么这里的范围就应该是0到18啦
	else
		printf("未成年");
}

我们可以发现,每一个if语句后,都跟着一条语句,只要前面条件成立,那么这条语句就会被执行,那如果条件成立,我们要执行多条语句呢?我们又应该怎么写? 

我们可以根据上面的代码,再补充一下,具体如下:

#include<stdio.h>
//代码2
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
	{
		printf("%d岁", age);
		printf("是成年人");
	}
		
	else if (age < 0)
		printf("输入有误");
	else
	{
		printf("%d岁", age);
		printf("未成年");
	}
	return 0;
}

可以看到,不同于代码1,代码2用一对{}将if语句后的多条语句给括起来,这个代码块也就是上面所提到的复合语句,用一对{}括起来的多条语句。所以,当条件成立时需要执行多条语句时,需要把要执行的语句写入{}中,如果没有,那么条件成立时,if语句只会执行在它之后的第一条语句(but我实验了一下,程序直接报错,无法运行。)

事实上只执行一条语句的话,也可以选择使用{},可以让代码看起来更加容易阅读,逻辑更清晰,后面会提到if语句的书写形式,uu们可以比较一下。

2.2 else悬空

uu们可以看一下下面这段代码,大家认为运行结果会是什么呢?

#include<stdio.h>
//代码1
int main()
{
	int a = 0;
	int b = 1;
	if (a == 2)
		if (b == 1)
			printf("gg\n");
	else
		printf("dd\n");
	return 0;
}

当时在学这个的时候,我就踩坑啦,以为程序会打印出"dd";

事实上,这个程序的运行结果是什么都不打印。

为什么呢?我们来看一下代码2:

#include<stdio.h>
//代码2
int main()
{
	int a = 0;
	int b = 1;
	if (a == 2)
	{
		if (b == 1)
		{
			printf("gg\n");
		}
	}
		
	else
	{
		printf("dd\n");
	}
	return 0;
}

代码2的运行结果就是"dd"啦,阅读代码2,我们可以清晰地观察到不同if 和else语句之间的从属关系,而在代码1中,else应该是匹配它上面的if(b == 1)的,也就是执行if(b == 1)和else的前提是,if(a == 2)为真。因此当if(a == 2)为假时,下面所有的语句都不会被执行,程序自然就什么都不打印了。

从这两段代码的对比中我们可以学到,else是和离它最近的if相匹配的。

2.3 if的书写形式

#include<stdio.h>
//代码1
int main()
{
	int a = 0;
	if (a == 1) {
		printf("dd");
	}
	else {
		printf("gg");
	}	
}

//代码2
int main()
{
	int a = 0;
	if (1 == a)
	{
		printf("dd");
	}
	else
	{
		printf("gg");
	}
}

通过上面两段代码的对比,可以看到代码2的逻辑更加清晰,更容易读懂,且不容易出错。

不仅是if语句,在编写程序的时候,我们也要做到严谨、简洁的书写形式,必要时适量加入注释,方便后期重新阅读代码。

3.switch语句

switch语句常常使用于多分支的情况下,当你需要多个条件判断时,用if...else if...else if...else就显得有点冗杂且麻烦了,这时候就需要我们的switch语句发挥作用了。

3.1 switch的语法结构

同样,我们需要先了解一下switch语句的使用格式:

switch (变量表达式)
	{
		case (常量1):
			语句1;
        case (常量2):
            语句2;
		......
	}

不同于if判断真假,switch语句是通过判断变量表达式与其中一个case语句中的常量是否相符,相符时就执行这个case语句后面的语句,并依次执行后面所有case语句中的语句

以上面代码为例,即当变量表达式的值等于常量1时,就会执行语句1,紧接着执行语句2。

但是如果我们只想执行语句1不想执行语句2呢?

很显然,这个逻辑并不能满足我们实现分支,所以,switch还需要搭配关键字break一起使用;

现在我们来写一个程序,输入1~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;
}

假设现在输入3,程序开始运行,此时day = 3,switch找到和day = 3相等的case 3,开始执行case 3 后面的语句,即打印"星期三",紧接着执行break语句,跳出switch语句,程序结束。

运行结果会不会和我们想的一样呢?我们运行一下看看:

 运行结果和我们判断的一样,证明我们的思路是没问题的,为了让大家更清晰地感受到break语句在switch语句中的作用,我们现在改变一下需求,输入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;
}

 假设输入1,此时day = 1,程序开始执行case1后的语句,但case1后是没有语句的,所以程序开始执行case2的语句,以此类推,程序会依次执行下去直到case5这里打印"工作日",然后执行break语句跳出switch语句,程序结束。

可以看到,break语句的作用就是将不同case下的语句划分为不同分支

那么,如果我们输入的不是1~7的数字呢?

这里就引出了和switch语句配套使用的另一个关键字:default。

3.2 default子句

当switch变量表达式和所有case标签的常量都不相符时,switch就会跳过所有的case语句,程序不会报错,也不会终止。

如果我们不想忽略switch变量表达式和所有case标签的常量不匹配的情况,我们就可以在语句列表中增加一条default子句,这个default语句可以出现在语句列表的任意一个位置,当switch变量表达式的值和所有case标签的值不相符时,switch语句就会执行default子句,因此,每个switch语句中只能出现一条default子句。

还是以上面的例子作为示范,我们加入一条default子句,当输入的值不是1~7时,打印"输入有误!",具体代码如下:

#include<stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
//这里故意将default放到中间,是想告诉大家default子句是可以出现在语句列表任意一个位置的
//但我比较习惯放在结尾
    default:
		printf("输入有误!\n");
		break;
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	}
	return 0;
}

我们输入8,看一下运行结果:

 在每个switch语句中都放入一条default子句是一个好习惯,也可以在后面加一个break,这样更能体现程序逻辑上的严密性。

以上就是C语言分支语句的所有内容啦,事实上这些语句还能够嵌套调用,这就需要大家勤加练习,多刷题,熟练掌握语句的使用方法啦!

下期内容会给大家介绍一下C语言的循环语句,敬请期待咯^_^

如有错误,还请大佬们及时指出(salute)

如果你觉得这篇文章对你有帮助的话,麻烦动动小手为我点个赞哦OvO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

code菜只因

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

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

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

打赏作者

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

抵扣说明:

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

余额充值