• 【C语言】分支和循环语句(上)


    前言

    这一篇主要讲分支和循环语句里面的分支语句,循环语句的讲解在下一篇博客里面讲解。

    1.什么是语句?

    • C语言是【结构化】的控制语句

    在这里插入图片描述

    • C语句可分为以下五类:
    1. 表达式语句
    2. 函数调用语句
    3. 控制语句
    4. 复合语句
    5. 空语句
    • 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
      可分成以下三类:
    1. 条件判断语句也叫分支语句:if语句、switch语句;
    2. 循环执行语句:do while语句、while语句、for语句;
    3. 转向语句:break语句、goto语句、continue语句、return语句。

    2.分支语句(选择结构)

    2.1 if 语句

    if 语句语法结构

    如果表达式的结果为真,则语句执行。
    在C语言中0表示假,非0表示真。

    (1)

    if(表达式)
       语句;
    
    • 1
    • 2

    (2)

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

    (3)多分支

    if(表达式1)
       语句1;
    else if(表达式2)
        语句2;
    else
        语句3
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 示例代码1
    #include <stdio.h>
    int main()
    {
    	int age = 0;
    	scanf("%d", &age);
    	if (age < 18)
    	{
    		printf("未成年\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    • 示例代码2
    #include <stdio.h>
    int main()
    {
    	int age = 0;
    	scanf("%d", &age);
    	if (age < 18)
    	{
    		printf("未成年\n");
    	}
    	else
    	{
    		printf("成年\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    • 示例代码3
    #include <stdio.h>
    int main()
    {
    	int age = 0;
    	scanf("%d", &age);
    	if (age < 18)
    	{
    		printf("少年\n");
    	}
    	else if (age >= 18 && age < 30)
    	{
    		printf("青年\n");
    	}
    	else if (age >= 30 && age < 50)
    	{
    		printf("中年\n");
    	}
    	else if (age >= 50 && age < 80)
    	{
    		printf("老年\n");
    	}
    	else
    	{
    		printf("老寿星\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    如果条件成立,要执行多条语句,应该怎么使用代码块?
    if 和 else 都只能控制一条语句,有多条语句必须使用 { }。这里的一对{ }就是一个代码块

    #include <stdio.h>
    int main()
    {
    	if (表达式)
    	{
    		语句列表1;
    	}
    	else
    	{
    		语句列表2;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    代码示例

    #include <stdio.h>
    int main()
    {
    	int age = 10;
    	if (age < 18)
    	{
    		printf("未成年\n");
    		printf("不能饮酒\n");
    	}
    	else
    	{
    		printf("成年\n");
    		printf("打游戏\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    2.1.1 悬空else

    看下面的代码,猜猜打印的结果是 hehe 还是 haha

    #include <stdio.h>
    int main()
    {
    	int a = 0;
    	int b = 0;
    	if (a == 1)
    		if (b == 2)
    			printf("hehe\n");
    	else
    		printf("haha\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    分析:
    看打印结果我们会发现打印结果不是 hehe 也不是haha,而是空的,我们回看这个代码的格式会让我们以为 else 是和第一个 if 匹配,但是 else是和他离得最近的 if 匹配的,所以 if(a==1)条件不成立,结果为假,不执行语句,结果为空。一个 if…else语句才是一条完整的语句。

    改正:

    //适当的使用{}可以使代码的逻辑更加清楚。
    #include <stdio.h>
    int main()
    {
    	int a = 0;
    	int b = 0;
    	if (a == 1)
    	{
    		if (b == 2)
    		{
    			printf("hehe\n");
    		}
    	}
    	else
    	{
    		printf("haha\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    2.1.2 if 书写形式的对比

    代码1

    if (condition) {
        return x;
    }
    return y;
    
    • 1
    • 2
    • 3
    • 4

    代码2

    if(condition)
    {
        return x;
    }
    else
    {
       return y;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码3

    int num = 1;
    if(num == 5)//这里如果不小心少写了一个等号编译器是不会报错的,当只有一个等号的时候是赋值的意思,因为num是一个变量的可以被重新赋值的,所以编译器不会警告。
    {
        printf("hehe\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码4

    int num = 1;
    if(5 == num)//if(num == 5),如果这里只有一个等号,编译器会报错,我们把常量放在右边,是不可以把一个变量赋值给一个常量的,即使写错了编译器也会很快帮我们发现问题。
    {
        printf("hehe\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码2和代码4更好,逻辑更加清晰,不容易出错。

    2.1.3 练习

    1.判断一个数是否是奇数

    我们这里学习了 if 语句,我们就尝试使用 if 语句写代码。

    #include <stdio.h>
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	if (num % 2 == 1)
    		printf("奇数\n");
    	else
    		printf("NO\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    2.输出1-100之间的奇数

    我们这里需要使用循环语句,我们可以用while循环也可以用 for 循环。

    //while 循环
    #include <stdio.h>
    int main()
    {
    	int i = 0;
    	while (i <= 100)
    	{
    		if (i % 2 == 1)
    			printf("%d ", i);
    		i++;
    	}
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    //for 循环
    #include <stdio.h>
    int main()
    {
    	int i = 0;
    	for (i = 1; i <= 100; i++)
    	{
    		if (i % 2 == 1)
    			printf("%d ", i);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    2.2 switch语句

    switch语句也是一种分支语句。
    常常用于多分支的情况。

    比如:
    输入1,输出星期一
    输入2,输出星期二
    输入3,输出星期三
    输入4,输出星期四
    输入5,输出星期五
    输入6,输出星期六
    输入7,输出星期日

    我没写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式。这就是switch 语句。

    switch//(整形表达式)
    {
    语句项
    }

    什么是语句项
    //是一些case语句:
    //如下:
    case 整形常量表达式:
    语句;

    2.2.1 在switch语句中的 break

    在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
    比如:

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    有时候我们的需求变了:

    1. 输入1-5,输出的是“weekday”;
    2. 输入6-7,输出“weekend”
      所以我们的代码就应该这样实现了:
    #include <stdio.h>
    int main()
    {
    	int day = 0;
    	scanf("%d", &day);
    	switch (day)
    	{
    	case 1:
    	case 2:
    	case 3:
    	case 4:
    	case 5:
    		printf("weekday\n");
    		break;
    	case 6:
    	case 7:
    		printf("weekend\n");
    		break;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    这里说明了 case 后面是可以不加 break ,没有 break 的时候会持续往下走。
    break 语句 的实际效果是把语句列表分化为不同的分支部分。

    编程好习惯
    在最后一个 case 语句的后面加上一条 break语句。
    (之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。

    2.2.2 default 子句

    default:
    写在任何一个 case 标签可以出现的位置。
    当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
    所以,每个switch语句中只能出现一条default子句。
    但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

    编程好习惯
    在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

    2.2.3 练习

    这里我们做一道练习,看我们是否对switch掌握熟练了,读下面的代码,算出的 m,n的值是多少?

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    注意:

    • switch 语句是可以嵌套使用的。
    • switch 语句里面的 break 只会跳出自己所在的 switch,不是说一个 break 跳出所有的 switch 语句。

    本章到这里就结束啦,如果有哪里写的不好的地方,请指正。
    如果觉得不错并且对你有帮助的话请给个三连支持一下吧!
    Fighting!!!✊

  • 相关阅读:
    腾讯mini项目-【指标监控服务重构-会议记录】2023-08-04
    05【C语言 & 趣味算法】经典:兔子产子问题(即:Fibonacci数列)
    x86和arm框架下的centOS
    西瓜视频基于 Hertz 的微服务落地实践
    【小程序】快来开发你的第一个微信小游戏(详细流程)
    Vivado 添加FPGA开发板的Boards file的添加
    软件管理 - yum - rpm -本地yum源 - 局域网远程yum源 - 阿里云镜像 - 克隆阿里云镜像源
    JAVA在线作业提交系统计算机毕业设计Mybatis+系统+数据库+调试部署
    javascript中什么叫“json方式”?
    unbuntu一条命令安装docker
  • 原文地址:https://blog.csdn.net/qq_68661624/article/details/124641098