分支语句if,switch

I.结构化

人说“C语言是个结构化的语言”

那你有没有想过什么什么是结构化呢?

我们生活中要完成一件事

都可以归类为三种结构(或它们的复合体):

  • 顺序结构:如先做什么,后做什么
  • 分支结构:如往左还是往右
  • 循环结构:如重复做一件事

而本篇讲的就是分支结构中的分支语句。

II.主要语句

I.if

1.大括号

if常常和else if和else搭配

我们看看下面这段代码

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");//当if下面只有一行代码,那么if的{}就是可写可不写。
	}
	else if (age < 30)//else if可以不用靠&&连接多个条件,而直接实现一个区间内的判断
	{
		printf("年轻人\n");
	}
	else if (age < 50)
	{
		printf("中年人\n");
	}
	else if (age < 100)
	{
		printf("老年人\n");
	}
	else
	{
		printf("寿比南山\n");
	}
	return 0;
}

这一段代码包含了if语句常见的else if和else

当你看第一个注释的时候

你就知道,if语句使用时

如果if下需要执行的代码只有一行

则你无需加上{}

就可以顺利执行

那如果有多行代码时也不加{}呢?

这个时候第一行代码还是一样执行

后面的代码呢?

它们不会失效

而是直接执行

相当于原本这段代码

	if (age < 18)
	printf("未成年\n");
    printf("成年\n");

会等同于这段代码

if (age < 18)
{
	printf("未成年\n");
}
    printf("成年\n");

第一段代码之后的陆续几行

都等同于被隐形的{}排除在外了

成为了一个独立于if之外的表达式

搞清这个后

我们还要扩充一个if的知识

2.执行

什么时候if会执行呢?

你可能觉得是满足if里括号的表达式时就会执行

但并不是这样

计算机并不深究这个

if只管括号里的是真命题还是假命题

只要是真命题它就会执行

所以经常会出现一个错误

即把比较写成赋值

int main()
{
	int a = 0;
	if (a == 1)
	{
		printf("good");
	}
	return 0;
}

这是一段正确的代码

我们要表达的意思就是如果a和1相等

if就执行

这里自然是不会执行的

那如果我们错写成下面这段代码呢?

int main()
{
	int a = 0;
	if (a = 1)
	{
		printf("good");
	}
	return 0;
}

那它就会执行!

因为括号里只是个赋值表达式

把1的值赋予给了a而已

其本质不可能为假

这个时候起到的效果就和我们预想的完全不一样了

这个时候我们有一种优化的习惯来解决这个问题

int main()
{
	int a = 0;
	if (1 == a)//把a放到后面来写
	{
		printf("good");
	}
	return 0;
}

当我们写成这种形式的时候

表达的意思是一样的

即a和1是相同大小的

但如果我们这个时候我们错把==写成=

我们的编译器就会报错

因为a是变量,b是常量

只能把常量赋予给变量

而不能把变量赋予给常量

这算是一种防失误的措施

是一种好习惯

II.else if

我们回到这个代码来

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");//当if下面只有一行代码,那么if的{}就是可写可不写。
	}
	else if (age < 30)//else if可以不用靠&&连接多个条件,而直接实现一个区间内的判断
	{
		printf("年轻人\n");
	}
	else if (age < 50)
	{
		printf("中年人\n");
	}
	else if (age < 100)
	{
		printf("老年人\n");
	}
	else
	{
		printf("寿比南山\n");
	}
	return 0;
}

我们发现第一个else if的括号里面是age < 30

其实它表达的就是当18<= age <30时执行

那你可能会疑惑

既然如此

我们为什么不直接在括号里填上18<= age <30呢?

这是因为C语言中不支持这种表达的直接实现

它会先被拆解为“18<= age”

假如18真小于等于 age,则为真

我们知道C语言中为真返回的是1

然后再被拆解为“1 < 30”

发现为假

所以else if不会去执行

因此我们可以借用&&来连接前后两个比较表达式

即age < 30可以写为age >= 18 && age < 30

但age < 30 更简洁

所以这里我采用了这种方式

因为前面if已经有age < 18 的情况了

我们这里写age < 30就可以了

你可以看到后续的的else if我也是这样写的

III.else

我们看看这段代码

int main()
{
	int a = 0;
	int b = 2;
	if (0 == a)
		if (2 == b)
			printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}

我问你最后输出的结果是什么?

如果你想的是输出haha

那你成功被我带进坑里了

这段代码最后的输出结果是什么也没有

为什么?

因为这种格式是我故意调出来的

实际上else的就近原则使得它是对应上一个离它最近的if

也就是这个if

		if (2 == b)
			printf("hehe\n");

实际上,更美观和便于理解的代码是这样的:

int main()
{
	int a = 1;
	int b = 2;
	if (0 == a)
		if (2 == b)
			printf("hehe\n");
	    else
		    printf("haha\n");
	return 0;
}

当没有大括号限制时

else就是遵循这么一个就近原则的

IV.switch

switch常常和default在一起使用

我在这就把它们一块给讲了

看下面这段代码

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)//day就是参数,而且是整形参数,所以数组类型也行。不过字符也可以,为什么呢?因为字符会对应ASCII表转换成整形。
	{
	case 1:
		printf("星期一,要工作\n");
		break;//case只是点明入口,如果没有break,就会一路执行下去,相当于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;
	default://default相当于if语句中的else,当参数没有可执行的case时,就可以执行。
		printf("请确认自己输入的是数字1到7\n");
	}
	return 0;
}

这段代码首先就告诉了我们switch的使用格式:

switch ((一个参数))

{

case (具体的参数):

         break;

......

default :

......

}

我们看看这个格式吧case switch default break都是固定的

不能随意命名的

我们需要给定一个参数

让它参与到switch的执行当中

1.case

这里容易误解的一个点就是case

你会不会想break是干嘛的

假如我们去掉break

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");

	default:
		printf("请确认自己输入的是数字1到7\n");
	}
	return 0;
}

这个时候我们输入的day假设是6

那输出的结果是什么?

是不是“星期六,休息吧”?

并不只是这样

它还会输出“星期天,休息吧”

因为case只是一个入口

告知switch程序从这开始执行

但没有告诉出口

而break就是告知的出口

加上了break

switch才不会向下继续执行

而是在break处中止

而default呢就相当于if中的else

case就相当于if

当case都不会被执行时

default才会发挥它的作用

这里的作用是提醒

2.参数

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)//day就是参数,而且是整形参数,所以数组类型也行。不过字符也可以,为什么呢?因为字符会对应ASCII表转换成整形。
	{
	case 1:
		printf("星期一,要工作\n");
		break;//case只是点明入口,如果没有break,就会一路执行下去,相当于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;
	default://default相当于if语句中的else,当参数没有可执行的case时,就可以执行。
		printf("请确认自己输入的是数字1到7\n");
	}
	return 0;
}

这里的day自然就是参数

这个参数是有要求的

即它得是一个整形参数

但如果day是一个字符参数

那也没有关系

因为字符会对应ASCII表转换成整形

例如‘A’就会被转换为65

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值