【C语言】分支语句(if,switch)

本文详细解析了C语言中的if和switch选择语句,包括if语句的真假判断、悬空else的理解,以及switch语句的结构、break和default子句的作用。通过实例演示和注意事项,帮助读者掌握分支控制的关键技巧。
摘要由CSDN通过智能技术生成

目录

1.什么是分支语句(选择语句)?

 1.1 if语句🚗

         1.1.1悬空else🚕

1.2 switch语句 🚙

1.2.1 break语句 🚌

1.2.2 default子句🚎


 

 

 

 

 

1.什么是分支语句(选择语句)?🛻

 

如果你学习了C语言,之后可以选择Java方向深造,亦可选择C++方向深造。

这就是分支,也叫选择语句。

9cbcc63927bd491b8792b1b0dc436b22.png

 1.1 if语句🚓

首先我们来看看if语句的基本结构

if(表达式1)
    语句1;

 

//多分支    
if(表达式1)            //如果表达式1为真,执行语句1
   语句1;
else if(表达式2)      // 如果表达式1为假,表达式2为真,执行语句2
   语句2;
else                 //如果表达式1,2都为假,执行语句3
   语句3;

例1.

48d34575a6764f4fb4613f382164c2ae.png

可以看到,我们最后的结果输入了ture,说明执行了第一条printf语句。 

例2. 

8dacb201a93a4efe9e62082d7b0b2449.png

 4979fc1230fb428aa3060dc5f62288a6.png

 可以看到,不同的选择,出现了不同的输出。

例3.

 cc359538ba3d43968eb3f24e957c71e4.png

 来看看这个例子,为什么输出了ture呢?

if语句里也没有判断啊?

其实是因为,在C语言中规定

非0即为真

例3中,a+b的结果是3,不为0,所以if语句判断为真,执行第一个printf语句。

 

1.1.1悬空else🏎️

什么是悬空else呢?先看代码

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("66666\n");
	else
			printf("99999\n");
	return 0;
}

先试着想象会输出什么

f6ef89fee20e42c6b501ef8b74aa5952.png

 

 你猜到了吗?这里什么都没有输出。

探究:

从第一个if语句开始,a等于1吗?答案是不等于

那么现在我们有三个选择。A.看到了else,输出99999。B.继续执行if语句b是否等于2,答案是的,输出666666。C.程序结束,什么都不输出。

好,现在我们来一一分析,A选择,我们首先要明白if else语句的匹配原则,当多个if 存在时,else匹配最近的一个if语句,我称其为就近原则,我这里故意把else对其第一个if语句,相信有很多人上当了吧。所以,这里的else是匹配第二个if语句的。自然不会输出99999.

B选择,我们来这样看看代码

dac2b9d156bc47ad84048ace5e34b28f.png

这下理解了吗,外层的if语句都为假了,内部还怎么执行。自然就不会输出66666。

所以,我们写代码时,一定要注意代码格式!不要偷懒少些括号,这些都是致命错误!

 

1.2 switch语句 🦼

1a55a7bcccad4fa693bbf6c993fff7d7.png

 与if语句一样,是选择语句。

来看看switch语句的结构

 

switch(整型表达式)
{
case 整形常量表达式:
    语句;    
}

42cc585ef2c64bdea97219388fd84cfd.png

Switch的表达式为day,day=1,所以输出星期一。

 

1.2.1 break语句 🛵

如果我们要存在很多个选项,我们就要用break语句去终止。

先来看看不使用break语句的后果吧

102a758cad204c6bae604627699daf62.png

 结果输出了星期一,星期二,但我们想要的结果只是输出星期一。

所以我们要添加break语句,让break来终止。而break语句 的实际效果是把语句列表划分为不同的分支部分。

所以我们尽量在每次case语句后都加上break语句,养成好习惯。

 

1.2.2 default子句🛺

如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
和if语句的else语句是不是有点相似呢?

最后,来试试这道题吧。 

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

你是否做对了呢? 

 

191a627d6fbe45c7b368c29ae584d481.png

 

本节分支语句就到这里结束啦! 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JJY_s

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

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

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

打赏作者

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

抵扣说明:

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

余额充值