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


    前言

    在上一篇博客里面我们讲到了分支语句,所以这一篇博客将讲解循环语句。

    1. 循环语句

    循环语句分为三种:

    • while 循环
    • for 循环
    • do while 循环

    1.1 while循环

    我们已经掌握了 if 语句:

    if(条件)
        语句;
    
    • 1
    • 2

    当条件满足的情况下,if语句后的语句执行,否则不执行。
    但是这个语句只会执行一次。由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢?

    C语言中给我们引入了: while 语句,可以实现循环。

    //while 语法结构
    while(表达式)
         循环语句;
    
    • 1
    • 2
    • 3

    while 语句的执行流程:
    在这里插入图片描述

    我们尝试用 while 循环语句在屏幕上打印1-10的数字。

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

    在这里插入图片描述

    1.1.1 while 语句中的 break 和 continue

    • break 介绍
    //break 代码实例
    #include <stdio.h>
    int main()
    {
    	int i = 1;
    	while (i <= 10)
    	{
    		if (5 == i)
    			break;
    		printf("%d ", i);
    		i++;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    这里我们会发现代码输出的结果是 1 2 3 4,这和 break 在 while 循环中的作用有关系。
    break 在 while 循环中的作用:
    其实在循环中只要遇到 break,就停止后期的所有的循环,直接终止循环。所以:while 中的 break 是用于永久终止循环的。

    • continue 介绍
    //continue 代码实例1
    #include <stdio.h>
    int main()
    {
    	int i = 1;
    	while (i <= 10)
    	{
    		if (5 == i)
    			continue;
    		printf("%d ", i);
    		i++;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    我们看打印结果会发现代码输出的是 1 2 3 4 并且光标还在动,证明出现了死循环。

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

    在这里插入图片描述

    总结:
    continue在while循环中的作用:
    continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

    1.2 for 循环

    在前面我们已经学习了 while 循环,但是我们为什么还要学习一个 for 循环呢?看下面 for 循环的语法,还有 for 循环和while 循环的对比突出了 for 循环的优势。一起来看吧!

    1.2.1 语法

    for(表达式1;表达式2;表达式3)
        循环语句;
    
    • 1
    • 2
    • 表达式1
      表达式1为初始化部分,用于初始化循环变量的。
    • 表达式2
      表达式2为条件判断部分,用于判断循环时候终止。
    • 表达式3
      表达式3为调整部分,用于循环条件的调整。

    分别用 for 循环和 while 循环 在屏幕上打印1-10的数字

    for循环的执行流程图:
    在这里插入图片描述

    //while 循环
    #include <stdio.h>
    int main()
    {
    	int i = 1;//初始化
    	while (i <= 10)//判断部分
    	{
    		printf("%d ", i);
    		i++;//调整部分
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    //for 循环
    #include<stdio.h>
    int main()
    {
    	int i = 0;
    	//for (i = 1//初始化; i <= 10//判断部分; i++//调整部分)
    	for (i = 1; i <= 10; i++)
    	{
    		printf("%d ", i);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    可以发现在 while 循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for 循环的风格更胜一筹;for 循环使用的频率也最高。

    1.2.2 break 和 continue 在 for 循环中

    我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。但是还是有些差异。

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

    在这里插入图片描述

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

    在这里插入图片描述

    总结:
    只要遇到 break 就会跳出本次循环;遇到continue 是跳过本次循环后面的代码,for 循环遇到continue 会跳过本次循环后面的代码来到调整部分,而 while跳过本次循环后面的代码的同时也跳过了调整部分直接来到判断部分所以会出现死循环。

    1.2.3 for 语句的循环控制变量

    建议:

    1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
    2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
    //代码1
    #include <stdio.h>
    int main()
    {
    	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    	//前闭后开的写法
    	int i = 0;
    	for (i = 0; i < 10; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    //代码2
    #include <stdio.h>
    int main()
    {
    	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    	//前闭后开的写法
    	int i = 0;
    	for (i = 0; i <= 9; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    看结果我们会知道代码1和代码2的结果是一样的,但是代码2的意义不大,判断里面的9就没什么意义,代码1判断里的10,我们一看就知道是循环10次的意思,所以比较推荐前闭后开的写法。

    1.2.4 一些 for 循环的变种

    代码1

    #include <stdio.h>
    int main()
    {
    	for (;;)
    	{
    		printf("hehe\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    for 循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。

    代码2

    #include <stdio.h>
    int main()
    {
    	int i = 0;
    	int j = 0;
    	//这里打印多少个hehe?
    	for (i = 0; i < 3; i++)
    	{
    		for (j = 0; j < 3; j++)
    		{
    			printf("hehe\n");
    		}
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    内层循环一次打印3次hehe,外层循环每次进入到内层循环都要打印3次,内层循环3次,外层循环3次,所以最终打印了9次。

    代码3

    #include <stdio.h>
    int main()
    {
        int i = 0;
        int j = 0;
        //如果省略掉初始化部分,这里打印多少个hehe?
        for (; i < 3; i++)
        {
            for (; j < 3; j++)
            {
                printf("hehe\n");
            }
        }
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    分析:
    外层循环还是进来了3次,但是内层循环初始化的部分省略了,只有第一次外层循环进来的时候有循环了3次,后面两次外层循环进来的时候 j 已经是等于2小于3了没有被初始化,所以后面两次进来的时候就直接跳出了循环。这就是省略代码带来的影响,随便乱省略容易出问题,所以不要随便省略代码哦。

    代码4

    //使用多余一个变量控制循环
    #include <stdio.h>
    int main()
    {
    	int x, y;
    	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
    	{
    		printf("hehe\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    1.2.5 一道笔试题

    //请问循环要循环多少次?
    #include <stdio.h>
    int main()
    {
        int i = 0;
        int k = 0;
        for (i = 0, k = 0; k = 0; i++, k++)
            k++;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    分析
    我们看到结果是0次,没有进入循环。
    因为 k 在这里是赋值不是判断,k 赋值为0,0为假,不进入循环,所以我们读代码的时候要认真看是一个等号还是两个等号,一个等号是赋值,两个等号实判断。

    1.3 do…while() 循环

    1.3.1 do 语句的语法:

    do
       循环语句;
    while(表达式);
    
    • 1
    • 2
    • 3

    1.3.2 执行流程

    在这里插入图片描述

    1.3.3 do 语句的特点

    循环至少执行一次,使用的场景有限,所以不经常使用。

    用do while循环打印1-10的数字

    #include <stdio.h>
    int main()
    {
    	int i = 1;
    	do
    	{
    		printf("%d ", i);
    		i++;
    	} while (i <= 10);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    1.3.4 do while 循环中的 break 和 continue

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

    在这里插入图片描述

    这里遇到 break 也是直接跳出循环,所以打印的是 1 2 3 4。

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

    在这里插入图片描述

    我们看打印结果会发现代码输出的是 1 2 3 4 并且光标还在动,证明出现了死循环。continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,直接跳到判断部分。

    总结:
    三种循环里面用的做多的是 for 循环,其次是 while 循环,最后是 do while循环。

    2. goto语句

    C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
    从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
    但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
    例如:一次跳出两层或多层循环。
    多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环

    goto语言真正适合的场景如下:

    for(...)
        for(...)
       {
            for(...)
           {
                if(disaster)
                    goto error;
           }
       }
        …
    error:
     if(disaster)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

  • 相关阅读:
    抖音获得抖音商品详情 API 返回值说明
    爱上开源之golang入门至实战第四章函数(Func)(十)
    C#进阶一刻钟抽象设计一个入门业务类,函数方法
    2023-8-20 CVTE视源股份后端开发实习一面
    【机器学习】之 K-最近邻(KNN)算法原理及实现
    Linux脚本:将.sh文件输出映射到日志文件并添加时间戳
    【Java面试】概念性的问题怎么答,看完高手的回答一口气答出完整思路,Nosql的理解
    【mysql为什么采用b+树作为索引】
    QPainter绘图
    设计模式学习(二十):备忘录模式
  • 原文地址:https://blog.csdn.net/qq_68661624/article/details/125470785