【C语言】选择语句(分支语句)


㊙️小明博客主页:➡️ 敲键盘的小明 ㊙️
✅关注小明了解更多知识☝️



前言

提示:本篇文章为C语言选择语句的个人总结,内容如若有误,请及时联系我更正。

  • 转载请注明原创,谢谢。

在这里插入图片描述

提示:以下是本篇文章正文内容:

一、什么是选择语句?

  假设你在水果摊购买一斤的水果,摊主会根据你购买的水果种类来计算价格。

行情:
 苹果🍎 7 7 7 / / /斤,葡萄🍇 8 8 8 / / /斤,
 香蕉🍌 5 5 5 / / /斤,草莓🍓 20 20 20 / / /

在这个场景中,选择语句就像摊主,根据你购买的水果种类(不同的条件)来计算不同的价格(执行不同的操作)。


二、if语句


注:C语言中:0表示假,非0表示真


1. 语句格式

🔴单分支

if(表达式)
{
	语句;
}

过程: 先计算“条件”表达式的值,如果该值不等于 0 0 0 ,表达式值为,执行“语句”,否则表达式值为,不执行“语句”

🔴双分支

if(表达式)
{
	语句1;
}
else
{
	语句2;
}

过程: 先计算“条件”表达式的值,如果该值不等于 0 0 0 ,表达式为,否则表达式为
  表达式为真时,执行“语句1”,表达式为假时,执行“语句2”

🔴多分支

if(表达式1)
{
	语句1;
}
else if(表达式2{
	语句2;
}
else
{
	语句3;
}

过程:

  1. 先计算表达式1的值,如果为,则执行“语句1”
  2. 如果表达式1,则不执行“语句1”,开始计算表达式2的值,如果为,则执行“语句2”
  3. 如果表达式2也为假,则执行“语句3”

2. if语句的使用方法

🔴单分支

#include<stdio.h>
int main()
{
	int m = 2;
	if(m < 5)
	{
		printf("小于5\n");
	}
	
	return 0;
}

运行结果:
在这里插入图片描述

过程: 我们将 2 2 2 赋值给 m m m ,在执行选择语句时, 2 2 2 确实是小于 5 5 5 ,则用于判断的表达式为,则执行了输出语句printf在屏幕上打印了: 小于 5 5 5

🔴双分支

#include<stdio.h>
int main()
{
	int m = 6;
	//int m = 4;
	if (m < 5)
	{
		printf("小于5\n");
	}
	else
	{
		printf("大于5\n");
	}

	return 0;
}

运行结果:
在这里插入图片描述

过程:
情况1: 同单分支一样,小于 5 5 5 的情况就是在屏幕上打印 小于 5 5 5
情况2: 6 6 6 赋值给 m m m 时,在执行选择语句时, 6 6 6 是大于 5 5 5 的,用于判断的表达式 ( 6 < 5 ) (6<5) (6<5),则不执行 i f if if 中的语句,转去执行 e l s e else else 中的语句,在屏幕上打印了: 大于 5 5 5

🔴多分支

#include<stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age >0)
    {
        if (age >= 18 && age <= 35)
        {
            printf("青年!\n");
        }
        else if (age < 18)
        {
            printf("未成年!\n");
        }
        else if (age > 35 && age <= 55)
        {
            printf("中年!\n");
        }
        else
        {
            printf("老年!\n");
        }
    }
    else
    {
        printf("输入年龄有误!!!\n");
    }
    return 0;
}

运行结果:
在这里插入图片描述

表达式不成立是不会进入该 i f if if 语句中的!

过程:
表达式1: 输入的值如果大于 0 0 0 ,则表达式1成立。
表达式2: 输入的值如果大于 18 18 18 并且小于 35 35 35 则表达式2成立,在屏幕上打印 青年!
表达式3: 输入的值如果小于 18 18 18 则表达式3成立,在屏幕上打印 未成年!
表达式4: 输入的值如果大于 35 35 35 且小于 55 55 55 则表达式4成立,在屏幕上打印 中年! ,如果表达式2、3、4 都不成立说明我们输入的年龄大于 55 55 55 的,则在屏幕上打印 老年!

如果输入的值为负数,则表达式1不成立,直接跳到最后一个 e l s e else else 语句,在屏幕上打印输入年龄有误!。(毕竟年龄是不能为负数滴😏,当然也可以再加个判断将年龄限制在百岁左右,不然输入几千岁几万岁不就妥妥的老妖怪了嘛😱😱😱)

3. 悬空的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;
}

如果老夫所料不错,施主的答案是 haha ,那么施主所想是否正确捏?
运行结果:
在这里插入图片描述
是不是有点小意外?为什么会这样呢?

C语言中, e l s e else else 与离它 最近的 i f if 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;
}

改成这样是不是就一目了然了,当我们优化以后可以看到在第一句判断时就已经不成立了,所以是不会进入选择语句内,直接到该语句的末尾。

在这里插入图片描述

总结: i f if if 语句可以单独使用,而 e l s e else else 必须和 i f if if 配对使用,并且 e l s e else else 是和它上面最近的未曾匹配的 i f if if 进行配对。

4. 嵌套的if语句

i f if if 语句是可以嵌套使用的,那么该怎样嵌套捏?

if(表达式1)
{
	if(表达式2)
	{
		语句1;
	}
	else
	{
		语句2;
	}
}
else
{
	if(表达式3)
	{
		语句3;
	}
	else
	{
		语句4;
	}
}

这种嵌套的 i f if if 语句运行流程是:

  先判断表达式1是否成立,如果 成立 ,则开始判断表达式2,表达式2成立则执行 语句1 ,表达式2不成立则执行 语句2
  如果表达式1 不成立 ,则开始判断表达式3,成立则执行 语句3 ,不成立则执行 语句4

5. 例题

练习一:

判断一个数是奇数还是偶数

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

练习二:

判断某一年是否为闰年
  闰年是指该年份能被 4 整除,且不能被 100 整除;或者能被 400 整除,那么该年份是闰年

#include <stdio.h>
int main()
{   
	int year = 0;
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		printf("%d是闰年\n",year);
	}
	else
	{
		printf("%d不是闰年\n", year);
	}
	return 0;
}

练习三:

判断一个数的值的范围

#include <stdio.h>
int main() 
{	
    int num = 0;
    printf("请输入一个整数:");
    scanf("%d", &num);
    if (num < 0) 
    {
        printf("输入的整数是负数。\n");
    }
    else if (num == 0) 
    {
        printf("输入的整数是 0。\n");
    }
    else if (num < 10) 
    {
        printf("输入的整数是小于 10 的整数。\n");
    }
    else if (num < 20) 
    {
        printf("输入的整数是大于等于 10 且小于 20 的整数。\n");
    }
    else 
    {
        printf("输入的整数是大于 20 的整数。\n");
    }
    return 0;
}

练习四:

比较两个数哪一个更大

#include <stdio.h>
int main() 
{   
    int a, b;
    printf("请输入两个数:");
    scanf("%d %d", &a, &b);
    if (a != b) 
    {
        if (a > b)
        {
            printf("%d > %d\n", a, b);
        }
        else
        {
            printf("%d < %d\n", a, b);
        }
    }
    else 
    {
        printf("%d = %d\n", a, b);
    }
    return 0;
}

三、switch语句

s w i t c h switch switch 也是一种分支结构,常常用于多分支的情况!若果 i f if if e l s e else else i f if if e l s e else else…过多时,可以选择用 s w i t c h switch switch 语句。

1. 语句格式

switch(表达式)
{
	case 常量表达式1: 语句1; break;
	case 常量表达式2: 语句2; break;
	······
	case 常量表达式n: 语句n; break;
	default: 语句 n+1;
}
  • s w i t c h switch switch 表达式的值是 c a s e case case 后面的常量表达式的可能取值。
  • s w i t c h switch switch 后面的表达式值的类型一般为 整型 或者 字符型
  • c a s e case case 子句后的常量表达式必须为简单的 整型 或者 字符型常量
  • 当执行完一个分支的执行语句后,如果没有遇到 b r e a k break break ,程序将无条件的继续执行后面的所有分支语句,直到遇到 b r e a k break break 后,则退出 所在的 s w i t c h switch switch 语句。
  • s w i t c h switch switch 语句也是可以 嵌套 使用的。

2. switch语句使用方法

由上面的第 4 4 4 点我们可以看到在没有遇到 b r e a k break break 之前,程序会无条件继续执行,直到遇到 b r e a k break break 才会结束,那么我们用代码来深刻体验一下:

#include <stdio.h>
int main() 
{
    int num = 2;

    switch (num) 
    {
    case 1:
        printf("num 的值是 1\n");
        printf("继续执行下面的 case 2 的代码\n");
    case 2:
        printf("num 的值是 2\n");
        printf("继续执行下面的 case 3 的代码\n");
    case 3:
        printf("num 的值是 3\n")printf("继续执行下面的 case 4的代码\n");
    case 4:
        printf("num 的值是 4\n");
        printf("继续执行下面的 case 5 的代码\n");
	case 5:
        printf("num 的值是 5\n");
        printf("继续执行下面的 case 6 的代码\n");
        break;
    case 6:
        printf("num 的值是 6\n");
    default:
        printf("未匹配到任何 case\n");
    }
    return 0;
}

运行结果:
在这里插入图片描述

可以看出,当 n u m = 2 num=2 num=2 时, s w i t c h switch switch 选择语句会从 c a s e case case 2 2 2 执行,但是在 c a s e case case 2 2 2 结束后并没有遇到 b r e a k break break,所以将继续执行接下来的语句,直到在 c a s e case case 5 5 5 结束时遇到 b r e a k break break,则跳出了所在的 s w i t c h switch switch 语句,而不再继续 c a s e case case 6 6 6 的语句。

3. break的妙用

在 C 语言中, s w i t c h switch switch 语句中的 b r e a k break break 作用是跳出 s w i t c h switch switch 语句,如果没有遇到 b r e a k break break 语句,程序会继续执行下一个 c a s e case case 标签后的语句。如果所有 c a s e case case 标签都没有匹配到 b r e a k break break ,程序会执行 d e f a u l t default default 标签后的语句。

所以加了 b r e a k break break s w i t c h switch switch 语句会更加严谨。

例如:

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

运行结果:
在这里插入图片描述

上面这段代码就很好的应用了 b r e a k break break,当我们输入 1 1 1 ~ 7 7 7 之间的数时,会在屏幕打印所对应的星期,并且在打印完后直接跳出,不再继续执行下面的选择。

4. 去掉部分break的switch语句

  我们已经知道了没有遇到 b r e a k break break,将继续执行后面的语句,直到遇到 b r e a k break break,才跳出所在的 s w i t c h switch switch 语句。
  那么我们是不是也可以利用一下这个规定,来达到可以在一定程度上减少代码量:

#include <stdio.h>
int main()
{
	int day;
	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~5当中的几,都会周五的下面的【工作日!】后,通过 b r e a k break break 跳出选择语句。
例如: 当我们输入2时,执行语句是空的,则继续往下执行,3和4也是空的,直到在 c a s e case case 5 中的 p r i n t f printf printf 语句打印:工作日!,执行完后遇到了 b r e a k break break ,跳出了选择语句。


注:
🔴🔴🔴default子句🔴🔴🔴

  如果表达的值与所有的 c a s e case case 标签的值都不匹配,也就是所有的语句都被跳过了,程序并不会被终止,也不会报错。
  但是,你不想忽略不匹配所有 c a s e case case 标签的表达式的值,该怎么办?
  当switch表达式的值与 c a s e case case 分支的条件都不满足时,程序将执行 d e f a u l t default default 子句。所以,每个switch语句中只能出现一条default子句,而且它可以出现在 s w i t c h switch switch 语句列表的任何位置,因为它只有在其他 c a s e case case 语句都不匹配时才会使用。

5. 嵌套的switch语句

#include <stdio.h>
int main()
{
    int a = 100;
    int b = 200;

    switch (a) 
    {
    case 100:
        printf("这是外部 switch 的一部分\n");
        switch (b) 
        {
            case 200:
            printf("这是内部 switch 的一部分\n");
        }
    }

    printf("a 的准确值是 %d\n", a);
    printf("b 的准确值是 %d\n", b);

    return 0;
}

运行结果:
在这里插入图片描述

如上面这段代码, s w i t c h switch switch 语句可以像 i f if if 语句一样也进行嵌套使用。
大家可以自己试一试其他的嵌套方式,由于嵌套的 s w i t c h switch switch 语句并不常用,小明就不过多的给大家介绍了。

6. 例题

练习一:

制作简易计算器

#include <stdio.h>
int main()
{   
    int first, second, result;
    char sign;
    scanf("%d%c%d", &first, &sign, &second);
    switch (sign)
    {
        case '+': result = first + second; 
            printf("%d", result); 
            break;
        case '-': result = first - second; 
            printf("%d", result);
            break;
        case '*': result = first * second; 
            printf("%d", result);
            break;
        case '/': result = first / second; 
            printf("%d", result);
            break;
        case '%': result = first % second; 
            printf("%d", result);
            break;
        default: printf("ERROR\n");
    }
    return 0;
}

练习二:

判断输入的字母是不是元音字母

#include <stdio.h>
int main()
{	
    char ch;
    scanf("%c", &ch);

    switch (ch)
    {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        printf("是元音字母\n");
        break;
    default:
        printf("不是元音字母\n");
    }

    return 0;
}

练习三:

判断某同学分数等级
  90分以上为 A,80~89分为 B,70~79分为 C,60~69分为 D,60分以下为 不及格。

#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d",&score);
    switch (score / 10)
    {
    case 10:
        printf("满分的好同学\n");
        break;
    case 9:
        printf("A\n");
        break;
    case 8:
        printf("B\n");
        break;
    case 7:
        printf("C\n");
        break;
    case 6:
        printf("D\n");
        break;
    default:
        printf("不及格\n");
    }
    return 0;
}

完结

好啦,阅读到这里就已经看完了本期博客的全部内容了
在这里插入图片描述

  • 58
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲键盘的小明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值