if else和switch分支语句

一、if else语句
1.if语句

if语句的语法格式如下

if(表达式)
    语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行
练习:输入一个整数,判断是否为奇数
#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d是奇数",num);


	return 0;
}
2.else语句

如果一个数不是奇数,那就是偶数了,对于任意一个整数,如果要判断是奇数还是偶数该怎么表示呢?

这就需要用到 if.....else.... 语句了,语法格式如下

if(表达式)
    语句1
else
    语句2

练习1:输入一个整数,判断是否为奇数,如果是奇数打印奇数,否则打印偶数

#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d是奇数\n", num);
	else
		printf("%d是偶数\n", num);

	return 0;
}

练习2:输入一个年龄,>=18岁就输出:成年,否则就输出未成年

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("成年\n");
	else
		printf("未成年\n");
	return 0;
}
3.分支中包含多条语句

默认在if else语句中只包含一条语句

比如:

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("成年\n");
	    printf("可以谈恋爱了\n");
	return 0;
}

这个代码无论输入的是>=18还是<18,"可以谈恋爱了"都会打印在屏幕中

158ff14d901b4791b1867799d4137404.png

91e4bedb1a9d424291c56a4645892345.png

         这是因为 if 语句只能控制⼀条语句,就是 printf("成年了\n"); ,if语句为真,则打印成年了, if语句为假,则不打印
      但是,对于 printf("可以谈恋爱了\n"); 是独立存在的,不管if语句的条件的真还是为假,都会被执行。
      那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用 {} 将代码括起来, else 后也可以跟上大括号
例如
#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)//if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
	{
		printf("成年了\n");
	    printf("可以谈恋爱了\n");
	}
	else//else 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
	{
		printf("未成年\n");
		printf("不可以早恋哦\n");
	}
		
	return 0;
}
4.嵌套if

在if else语句中,else还可以与另一个if语句连用构成多重判断

比如:要求输入一个整数,判断输入的整数是0,还是整数或者是负数

#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("输入的数字是0\n");
	else if (num > 0)//这里的if相当于嵌套在else语句中,形成嵌套结构
		printf("输入的数字是正数\n");
	else
		printf("输入的数字是负数\n");

	return 0;

}

练习:

1 输入⼀个人的年龄
2 如果年龄<18岁,打印"少年"
3 如果年龄在18岁至44岁打印"⻘年"
4 如果年龄在45岁至59岁打印"中⽼年"
5 如果年龄在60岁至89岁打印"⽼年"
6 如果90岁及以上打印"⽼寿星"
5.悬空else问题

如果多个if和else,可以记住这样一条规则,else总是和最接近的if匹配,请看代码:

#include <stdio.h>

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

输出结果是什么呢?

很多初学者,可能会判断成  :a不等于1,不执行else字语句打印haha

而实际上是

aab77ec0c98d4098b5482697996005db.png

为什么呢?
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近
的 if 匹配
上面的代码排版,让 else 和第⼀个 if 语句对齐,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成立的时候,自然想到的就是执行else子句,打印 haha 
但实际上 else 是和第⼆个 if 进行匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终什么都不打印
为了避免悬空else语句我们可以这样写代码:
#include <stdio.h>

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

只要带上适当的大括号,代码逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用。

二、switch语句
1.switch语句

除了if语句,C语言提供了switch语句来实现分支结构。switch语句是一种特殊的形式的if....else....结构,用于判断条件有多个结果的情况。

语法格式如下:

switch (expression)
{
    case value1: statement
    case value2: statement
    default: statement
}

上面代码中,根据表达式expression不同的值,执行相应的case分支,如果找不到对应的值,就会执行default分支。

注意:

1、swtich括号里面的值必须是整形表达式

2、case后的值,必须是整形常量表达式

3、字符类型也被归类到整形家族

2.if语句和switch语句的对比

练习:输入一个整数值,计算除3之后的余数

使用if语句完成,代码如下:

#include <stdio.h>
int main()
{

	int n = 0;
	scanf("%d", &n);
	if (n % 3 == 0)
		printf("余数为0\n");
	else if (n % 3 == 1)
		printf("余数为1\n");
	else
		printf("余数为2\n");

	return 0;
}

使用switch语句改写,代码如下:

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)//()里面只能是整型表达式 char属于整型表达式家族
	{
	case 0:
		printf("余数为0\n");
		break;
	case 1:
		printf("余数为1\n");
		break;
	case 2:
		printf("余数为2\n");
		break;
	}

	return 0;
}

注意:

1.case和后面的数字之间必须要有空格

2.每一个case语句中的代码执行完成后需要加上break,才能跳出switch语句

2.switch语句中的break

上述代码如果去掉case中的break会出现什么情况呢

        7除3余数为1,但是程序运行的结果中多了一行"余数是2"的打印。

这是为什么呢?

        原因是只有在switch语句中使用break才能跳出switch语句,如果某一个case语句中没有break语句,代码会继续往下执行,有可能执行其他的case语句中的代码,直到遇到break或者switch语句结束。

     当然也不算所有的case语句都需要break,这就需要根据实际情况来看了。

练习:输入1-7的数字,打印对应的星期几

例如:输入 1 输出 星期一

代码如下:

#include <stdio.h>
//练习:输入1~7的数字,打印对应的星期几
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;
}

此时需求发生变化

变为:输入1-5,输出"工作日"

输入6-7,输出"休息日"

代码如下:

#include <stdio.h>
//需求变化为输入1~5,输出“工作日”,输入6~7,输出“休息日”
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;
}
3.switch语句中的default语句

如果switch后表达式的值无法匹配代码中的case语句的时候,这个时候就要用到default语句了

语法格式如下:

switch (expression)
{
    case value1: statement
    case value2: statement
    default: statement
}

比如前面做的打印星期几的练习,如果day输入的不是1-7的数字,如果我们要提示:输入错误,则可以这样完成代码:

//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://输入的数字在1~5的范围内都会进入这个语句
		printf("工作日\n");
		break;
	case 6:
	case 7://输入的数字在6~7的范围内都会进入这个语句
		printf("休息日\n");
		break;
	default://数据大于7或小于1的时候执行该语句
		printf("输入的数据有误,应该输入1~7的数字\n");
		break;
	}
	return 0;
}

最后一个问题:switch语句中的case语句和default顺序问题

case 语句和 default 语句有要求顺序吗? default 只能放在最后吗?

其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。 不过我们通常是把 default 语句放在最后处理的。

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值