C语言语句篇——分支语句

Hello~我是芝士,前面的文章中给大家介绍了一些C语言初识篇的内容,对C语言的一些基本的语法以及程序的书写有了初步认识,后面给大家分享C语言语句篇,本篇分享C语言的分支语句


关于C语言中的语句,这里进行一个简单的介绍。C语句可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句
    今天要介绍的是C语言的控制语句中的分支语句。关于控制语句可以分为以下三大类:
  1. 分支语句(条件判断语句):if语句、switch语句
  2. 循环语句:while 语句、do while 语句、for语句
  3. 转向语句:break语句、goto语句、continue语句、return语句

1. if 语句

if 语句的介绍主要分为以下几个模块:

1.1 语法形式

if 语句也是选择语句,我们在进行选择的时候有单项选择、两项选择以及多项选择,在进行两项以及多项选择时通常会与else连用,构成if...else语句结构,具体的语法结构如下:

1. 单项选择结构
if(表达式)
	执行语句;
注:只有if里面的表达式判断为真(非零),才会对语句进行执行,否则没有输出。

2. 两项选择结构
if(表达式)
	执行语句1else
	执行语句2;
注:当if里面的表达式判断为真(非零),语句1进行执行,否则执行else的语句23. 多项选择结构(这里以三项为例)
if (表达式1)
	语句1else if(表达式2)
	语句2else
	语句3;
注:当if里面的表达式1判断为真(非零),执行语句1,
否则对else if的表达式2进行判断,为真执行语句2,
表达式12都为假,执行语句3

下面用具体的程序进行测试:

#include <stdio.h>
int main()
{
	int a = 10;
	//单项选择结构
	if (a !=0)
	{
		printf("Hello world\n");
	}
	
	//两项选择结构
	if (a == 0)
	{
		printf("a的值为0\n");
	}
	else
	{
		printf("a的值不为0\n");
	}

	//多项选择结构
	if (a ==0)
	{
		printf("a的值为0\n");
	}
	else if (a == 1)
	{
		printf("a的值为1\n");
	}
	else
	{
		printf("a的值不为0也不为1");
	}
	return 0;
}

得到输出结果:

Hello world
a的值不为0
a的值不为0也不为1

从以上程序代码中我们发现有一个{ }符号也叫做代码块,这是分支语句的组成部分之一。当要执行多条语句时,适当的使用{ }可以使代码的逻辑更加清楚,具体的理解我们后面进行详细介绍。

1.2 else使用

我们在实际运用时,常常涉及到两个及两个以上的分支选择,因此else的配合使用能够帮助我们实现更多功能。

1.2.1 悬空else

上面的程序我们简单地体验了else的使用,else不仅仅能够与if构成if...else语句,还能够与if构成else if 进行选择判断。需要注意的是:如果有多个 if 和 else,else总是跟最接近的if进行匹配,这样的匹配原则也叫做悬空else问题。具体可以见下面代码:

#include <stdio.h>
int main()
{
	int a = 1;
	int b = -1;
	if (a < 0)
		if (b == -1)
			printf("Hello world");
	else
		printf("Hello");
	return 0;
}

输出结果

//输出结果为空

根据运行的结果,我们可以知道本质上else是与最近的if进行匹配的,即与if (b == -1)的if匹配。因为if (a < 0)为假,因此直接不进行进一步的判断。输出为空。

1.2.2代码块{ }

为了解决上面的悬空else问题,我们可以用{ }代码块进行逻辑的梳理。代码修改如下所示:

#include <stdio.h>
int main()
{
	int a = 1;
	int b = -1;
	if (a < 0)
	{
		if (b == -1)
		{
			printf("Hello world");
		}
	}
	else
	{ 
		printf("Hello");
	}
	return 0;
}

输出结果

Hello

因此,我们可以带上适当的⼤括号,代码的逻辑就会更加的清晰。

1.2.3 else if

前面提到 else不仅仅能够与if构成if…else语句,else 可以与另⼀个 if 语句连⽤,构成多重判断——else if也叫做嵌套if。举个例子:要求输⼊⼀个整数,判断输入的整数是0,正数或者负数。按照if…else语句书写代码如下:

int main()
{
	int i = 0;//初始化
	printf("请输入一个数: ");
	scanf("%d", &i);
	if (i>0)
	{
		printf("输入的数字是正数");
	}
	else
	{
		if (i <0)
		{
			printf("输入的数字是负数");
		}
		else
		{
			printf("输入的数字是0");
		}
	}
	return 0;
}

这段代码的结构可以这样看:
在这里插入图片描述
不难发现橙色框线部分的稍微有些复杂不够简洁,因此我们可以对代码进行修改,在不改变其逻辑的情况下简化代码,这里就是用到else if,修改后的代码如下:

#include <stdio.h>
int main()
{
	int i = 0;//初始化
	printf("请输入一个数: ");
	scanf("%d", &i);
	if (i>0)
	{
		printf("输入的数字是正数");
	}
	else if (i <0)
		printf("输入的数字是负数");	
	else
			printf("输入的数字是0");
	return 0;
}

下图中蓝色背景的代码就是嵌套在前面的 else ⼦句中的,构成了嵌套的if语句
在这里插入图片描述

2. switch语句

分支语句的另一个就是switch,常常用于多分支的情况。

2.1 语法形式

switch 语句是一种特殊形式的if…else结构,它能够将多重的else if改成更加简洁和可读的模式。其语法规则如下:

switch (整型表达式)
{
	case 整形常量表达式:
		执行语句1;
	case 整形常量表达式:
		执行语句2;
		......
	default:
		执行语句;
}

这个语法结构的意思是,程序执行起来后,根据表达式不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀
需要特别注意:

  1. switch后的表达式必须是整型表达式;
  2. case后的值必须是整型常量表达式

关于这两个表达式,我们通过下面例子中程序进行理解:

//键盘上输入数字,输出对应的星期
#include <stdio.h>
int main()
{
	int day = 0;//初始化变量day
	printf("请输入星期数字:");
	scanf("%d", &day);
	switch (day)
	{
	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;
	default:
		printf("请输入1~7的整数");
		break;
	}
	return 0;
}

由于switch语句中,没办法直接实现分支,搭配break使用才能实现真正的分支。根据上面的程序我们可以知道 day 就是一个整型表达式,case后面的具体数值就是整型常量表达式switch语句的运行机制就是:根据其整型表达式进入语句内,然后根据case整型常量表达式的值匹配相应的执行语句,break起到跳出switch语句的作用default在整型表达式与常量表达式的值没有相匹配的时候执行。关于这里面的break和default我们接下来进行详细介绍。

2.2 switch中的break

前面讲到,break在switch中的起到跳出作用。如果面的程序中没有break,那么switch语句就构成不了分支作用,具体见下面代码:

#include <stdio.h>
int main()
{
	int day = 0;
	printf("请输入工作日星期数字: ");
	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");
	default:
		printf("请输入1~5数字");
	}
	return 0;
}

这里输入数字3,得到输出结果:
在这里插入图片描述
可以发现case 3 后面的执行语句都输出了,因此break的作用不言而喻了。出现这一情况的愿意是:switch 语句是分⽀效果,但只有在 switch 语句中使用 break才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,直到遇到 break 语句或者 switch 语句结束

2.2 switch中的default

在使⽤ switch 语句的时候,如果switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。如果并不想忽略不匹配所有标签的表达式的值时,可以借助default子句进行提醒
语法结构为:

default:
	执行语句;

具体效果如下例子:输入1~5数字时,输出工作日,输入6和7,输出休息日。

#include <stdio.h>
int main()
{
	int day = 0;
	printf("请输入:");
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;
	default:
		printf("请输入合适范围的数字");
		break;
	}
	return 0;
}

当输入超出范围的数字,得到以下结果:
在这里插入图片描述
关于default字句的位置,在 switch 语句中 case 语句和 default 语句是没有顺序要求,但根据写代码的逻辑我们通常把 default 子句放在最后处理。

3. if 和 switch 对比

if 语句和switch 语句都是分支语句,都能够进行分支选择,但是两者还是有不同之处。通过以下程序进行对比:
要求:输⼊任意⼀个整数值,计算除3之后的余数
if 语句实现

#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个数字:");
	scanf("%d", &num);
	if (num % 3 == 0)
	{
		printf("余数为0");
	}
	else if (num % 3 == 1)
	{
		printf("余数为1");
	}
	else
	{
		printf("余数为2");
	}
	return 0;
}

switch语句实现

#include <stdio.h>
int main()
{
	int num = 0;
	printf("请输入一个数字:");
	scanf("%d", &num);
	switch (num % 3)
	{
	case 0:
		printf("余数为0");
		break;
	case 1:
		printf("余数为1");
		break;
	case 2:
		printf("余数为2");
		break;
	}
	return 0;
}

对于以上两个语句的区别可以总结如下:

特征区别
判断条件类型if语句可以使用各种条件表达式,而switch语句只能使用整数或字符常量作为条件
用途if语句用于处理各种复杂的条件逻辑,而switch语句用于多个固定取值的情况下进行条件判断
可读性当条件较为简单时,if语句易于理解,条件较复杂时可读性下降;而当存在多个固定值判断时,switch语句的可读性更高
性能当条件较多时,if-else if-else 结构的性能较差,而switch语句因为使用跳转表结构,性能一般来说比较高
执行方式if语句从上至下依次匹配条件,符合条件则执行对应代码块;而switch语句根据条件值直接跳转到对应分支,不需要逐一匹配条件

我们在实际的编程中,选择使用if语句还是switch语句通常基于具体的条件逻辑和代码需求。

Ok~以上就是本次分享的所有内容啦,如果有书写不当之处还望批评指正 😃 ps(碎碎念)坚持复习的第三天,明天也要继续加油鸭🦆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值