C语言参悟-循环控制

news2024/10/7 12:22:56

C语言参悟-循环控制

  • 一、循环综述
    • 1. C语言的循环概念
    • 2. 循环条件
    • 3. 循环单元
    • 4. 循环中断
  • 二、for 循环
  • 三、while 循环
  • 四、do while 循环

一、循环综述

下面只是我的对于C语言的认识拙见,可以多多提出批评建议😄

计算机的诞生很大程度上就是为了来进行重复性的某些工作,就像工厂里面的流水线一样,都是在重复的循环做某一件事情,只要涉及到工作,就需要流程来控制,流程里面一个很重要的概念就是循环,循环的诞生就是解决实际工作中重复性的做一些工作。计算机的我记得就是遵循图灵机模式,很类似流水线的工作。计算机的CPU总是遵循着按照一定的流程运行的。

在这里插入图片描述

对于C语言作为一个编程语言也是遵循这样的流程,体现在源码就是代码从上往下执行:

也就是在CPU运行这个编译好的程序的代码的时候也是 按照

  • -> a = a + 1;
    -> b = a + 1;
    -> i = a + b;
    -> return 0;

上面的顺序执行的。

#include <stdio.h>

int main()
{
	int i = 0, a = 1, b = 2;
	
	a = a + 1;
	b = a + 1;
	i = a + b;

	return 0;
}

编程语言的灵活性很大程度上就是体现在流程控制,流程控制里面最重要的也就是 重复执行语句(循环)、满足条件执行语句(分支)。

1. C语言的循环概念

C语言里面对于流程控制里面的循环重复提供了好几种方案,每一种方案都是具有特定的工作场景的。

C语言里面提供了三种循环:

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

基本流程都是像下面这种
在这里插入图片描述

循环的基本结构:

  • 循环条件
    其实就是类似 if 里面条件计算的值 就是 0 1 控制
  • 循环单元
    就是循环里面的语句
  • 循环中断
    就是 break、continue 这种控制的。一般不会用 goto (比较危险)、Return 有时候也会使用的。

我们可以看看基本的 这个 循环的语法

//for 循环
for(循环条件)
{
	循环单元-(包含 循环中断-可选)
}

//while 循环
while(循环条件)
{
	循环单元-(包含 循环中断-可选)
}

//do while() 循环
do 
{
	循环单元-(包含 循环中断-可选)
}while(循环条件)

循环也是受控制的,并不是说循环会处于一直循环一直不循环循环了就不可以断跳不过循环里面的某次循环单元 的状态。受控制的话就是 循环条件循环中断:循环条件其实就是控制循环的起始、中断之类的;循环中断其实就是用的 continue;break 来弄。

对于 一直循环一直不循环 问题状态基本上是 开始的循环条件 问题
对于 循环了就不可以断跳不过循环里面的某次循环单元 问题状态 就是 循环中断 问题

2. 循环条件

循环的条件其实就是用的 1(非0) 和 0 表示的循环的起止。C语言就是用的就是 非0 表示 1,但是我一般还是用 的 1 来区分 0。只要一个式子是能计算出 0 或 非0 的式子就能充当循环条件的。 void 类型是不能充当循环条件的哈。

当然哈进入循环的条件肯定也是 1(非0),要退出循环条件的时候就是把循环条件的值置为 0 就结束循环了。

C语言的语句总是会计算出一个值的,之前是没有 布尔值,好像 C99 标准就是 有 _Bool 当 true 和 false 使用啦。

⭕️ 注意如果循环条件一直是 1 的话,就会一直处于循环条件,就是死循环; 死循环有好有坏。死循环有时候很有用,有时候也是我们需要避免的。不想死循环的话,一定要记得让退出条件有效。

死循环条件有很多的 应用场景:

  • socket 持续监听、发送、接收数据。
  • 消息事件系统。
  • 服务器持续运行

循环条件的例子:

循环条件的例子其实就是 能够产生 0 或者非 0 的式子就可以的。当然,记住产生这个结果的式子的时候,这个式子可能已经执行了某些功能,或着已经获取到了某些东西。 并不是单纯的作为了一个结果标志。

  • 直接式
    直接写值。

  • 逻辑比较式
    就是基于逻辑运算符 >、 <、 >= 、<=、!=、==、&&、|| 计算出来的值。

  • 函数返回式
    就是把函数的返回值当成一个标志来判断

  • 计算式
    就是使用了 逻辑运算、算术运算、函数返回运算等组合的计算,这个是最灵活的。

下面就以 while 的循环条件举例子


//直接式-真值
while(1)
while(2)
while(-13)	//这个也是 真值哦!
while("")	//这个也是 真值哦!

//直接式-假值
while(0)
while('\0')
while(NULL)

//逻辑比较式-真值
while(1 != 2)
while(0 == 0)
while(1 == 1) //别写成了 赋值号 = 
while(1 > -12)
while('-' >= '+') // '-' 的ASCII值是 45; '+' 的ASCII值是 43
while('-' >= 44) //用的就是值比较的
while(45 >= 40 && 45 <= 50)	//逻辑合并比较
while(1 > 0 || 1 < 0)	//这个也是真值哦!C语言使用 || 判断时候是有逻辑短路性的,
						//只有 || 多个条件中,重左到右只有有一个真值就执行啦,
						// 但 && 是两个条件必须同时满足,就不具有逻辑短路

//逻辑比较式-假值
while(1 >= 2)
while('\0' > '+')
while(NULL == 1)

//函数式-真值
char m_ch;
//这个就是函数式子,这个执行了两个语句,第一个是获取字符,第二个是对读取的字符数比较
while(m_ch=getchar()) != EOF)	
{
	//从控制台读取数据
}
//这是一个函数原型:判断是否大写
int isCapitalized(char ch);
char ch = 'A';
while(isCapitalized(ch))
{
	//这里就可以判断是否大写字母
	// ch = ...语句之类
}

//计算式-真值
char m_ch = '-';
// 这个就是函数式子,这个执行了三个语句,
// 第一步是从控制台获取字符,
// 第二步是对读取的字符数比较是否是读正确没有
// 第三步是判断读取的字符是否是 '&'

while(m_ch=getchar()) != EOF && m_ch != '&')	
{
	//从控制台读取数据
}

//注意这个下面的写法和上面就是位置不对,

// 这个功能就完全不一样的哦,这个就是自己写代码的问题了
// 这里执行了三个语句,
// 第一步判断读取上一次的字符是否是 '&' :如果没初始化m_ch ,估计是有问题的,
// 第二步是从控制台获取字符,
// 第三步是对读取的字符数比较是否是读正确没有

while(m_ch != '&' && m_ch=getchar()) != EOF)
{
	//.....
}

3. 循环单元

循环单元其实就是需要我们循环去执行的代码。

在C语言中,这个循环单元其实是当成一个函数来运行的。那就需要记住在这个循环单元里面定义的新变量是无法在这个循环外面获取到的。而且每次循环结束的时候这些在循环里面定义新的变量都是被释放掉了;第二次新的循环的时候又会重新申请新变量的。这个就是完全和函数的内存分配机制是一样的。

这里面有时候就需要 修改循环单元外的变量,这是肯定允许的哈。也是实际工作中需要使用的。

这里面就是写功能代码的,没啥特别需要注意的。

4. 循环中断

这里的循环中断,我一般也会用到 break、continue、return 这种控制的。

我对于这个的理解就是上面的功能就是解决在循环时出现 循环了就不可以断跳不过循环里面的某次循环单元语句 的问题。

  • break :就是中断结束这次包含break 的循环。但如果这个循环的外面还有循环时,这个break只对当前循环区域起作用。
  • continue不中断结束 这次包含continue 的循环。只是在这个循环单元里面continue后面的语句就不执行了,和break的一样区域就开始下一次循环。
  • return:不仅是中断结束循环,而且是直接返回去了,这个作用区域是不管区域的。return 了 就直接函数结束了。在循环外后面的语句都不执行,这个有时候也会用到。

这里是 break的作用范围

for(int i = 1; i < 5; i++)
{
	for(int j = 6; j < 10; j++)
	{
            qDebug()<< i * 10 + j;

            if(j == 7 )
            {
            	//这里只会退出 j 的循环
                break;
            }
	}

	if(i == 2)
	{
			//这里就是退出i 的 循环
            break;
	}
}

//这个的输出就是
16 17 26 27

这里是break和continue的区别

    for(int j = 6; j < 10; j++)
    {

        if(j == 7 )
        {
            break;
        }

        qDebug()<< j;
    }
    //输出  6  

    for(int j = 6; j < 10; j++)
    {
        if(j == 7 )
        {
            continue;
        }

        qDebug()<<   j;
    }
    //输出  6  8 9 

这里是break和continue和return的区别

    for(int j = 6; j < 10; j++)
    {
        if(j == 7)
            return 0;

        if(j == 8 )
        {
            break;
        }

        qDebug()<< j;
    }

    for(int j = 6; j < 10; j++)
    {
        if(j == 7 )
        {
            continue;
        }

        qDebug()<<   j;
    }
//输出 6 

我在实际使用的时候 经常会使用到 continue ,一个场景就是 对循环的一个语句需要判断,判断就不继续执行了,这里是因为没办法使用 if else 那种多分支判断,这就需要用continue,就不用吧所有的 if 全部执行,就提高了效率。

while(条件)
{
	if(....)
	{
		...
		continue;
	}
	if(....)
	{
		...
		continue;
	}
	....
	if(....)
	{
		...
		continue;
	}
}

二、for 循环

三、while 循环

四、do while 循环

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

即拼七人拼团系统开发模式,上帮下扶机制逻辑规则解析

即拼七人拼团模式是最近非常火爆的商业模式&#xff0c;它主要融合了二二复制和拼团两种模式玩法&#xff0c;在快速裂变团队的同时&#xff0c;还能提高用户活跃度和粘性。这个模式中最大的亮点&#xff0c;就是它的上帮下扶机制&#xff0c;今天就在这里详细说一下。 所谓上帮…

6.文本三剑客--sed

文章目录 文本三剑客sed介绍命令介绍打印内容删除替换插入分组 文本三剑客 sed 介绍 sed编辑器 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来 编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么…

Robot Techology

Two-Stage Grasping: A New Bin Picking Framework for Small Objects 摘要&#xff1a;本文提出了一种新的抓仓框架&#xff0c;两级抓取&#xff0c;旨在精确抓取杂乱的小物体。 在第一阶段进行了对象密度估计和粗糙抓取。在第二阶段&#xff0c;需要进行精细的分割、检测、…

怎么制作网站?手把手教你10个网站建设的步骤!

怎么制作网站&#xff1f;手把手教你10个网站建设的步骤&#xff01;网站建设需要进行10个步骤&#xff0c;首先要确定网站建设的目标&#xff0c;考虑用户、品牌信息和竞争对手等&#xff0c;避免方向错误。其次&#xff0c;绘制网站建设地图和原型&#xff0c;确定位置大小、…

2023-详解整个数据仓库建设体系

一、数据仓库的基本概念 数据仓库与数据库的区别 数据仓库分层架构 数据仓库元数据的管理 二、数仓建模方法 范式建模法 维度建模法 实体建模法 三、维度建模 维度建模中表的类型 维度建模三种模式 维度建模过程 四、实际业务中数仓分层 数据源层ODS 数据明细层DW…

老域名扫描软件-老域名采集挖掘工具

老域名挖掘软件 老域名挖掘软件是一种可以帮助用户发现已过期或未续费的老域名的工具。以下是该软件主要特点&#xff1a; 大数据分析&#xff1a;该软件通过大数据分析技术&#xff0c;深度挖掘互联网上的闲置老域名&#xff0c;发现可用的未续费或已过期域名&#xff0c;从…

【面试题】面试官:说说你对 CSS 盒模型的理解

前言 CSS 盒模型是 CSS 基础的重点难点&#xff0c;因此常被面试官们拿来考察候选人对前端基础的掌握程度&#xff0c;这篇文章将对 CSS 盒模型知识点进行全面的梳理。 我们先看个例子&#xff1a;下面的 div 元素的总宽度是多少呢&#xff1f; js <!DOCTYPE html> &…

第七章结构性模式—适配器模式

文章目录 适配器模式解决的问题概念结构 类适配器模式对象适配器模式接口适配器模式应用场景JDK 源码 - Reader 与 InputStream 结构型模式描述如何将类或对象按某种布局组成更大的结构&#xff0c;有以下两种&#xff1a; 类结构型模式&#xff1a;采用继承机制来组织接口和类…

AUTOSAR-MemIf

1、MemIf的功能 从AUTOSAR的架构图中可以看出&#xff0c;MemIf(Memory Abstraction Interface)模块位于Memory Hardware Abstraction。  一方面&#xff0c;NvM使用MemIf提供的接口访问NV memory&#xff08;NV memory分为两种&#xff1a;Flash和EEPROM&#xff0c;位于MCAL…

APP图标尺寸规范一文了解清楚

在进行图标设计前&#xff0c;熟知手机 app 图标尺寸规范&#xff0c;能更好地去针对不同平台设计出更极致的图标。当前智能手机系统主要以 iOS 及 Android 为主&#xff0c;APP 图标是产品给用户的第一印象&#xff0c;图标视觉设计的美感与吸引力&#xff0c;与用户是否选择下…

分子模拟力场

分子模拟力场 AMBER力场是在生物大分子的模拟计算领域有着广泛应用的一个分子力场。开发这个力场的是Peter Kollman课题组&#xff0c;最初AMBER力场是专门为了计算蛋白质和核酸体系而开发的&#xff0c;计算其力场参数的数据均来自实验值&#xff0c;后来随着AMBER力场的广泛…

冷链保温箱在冷链中扮演了什么角色?

冷链运输是指某些食品原料、经过加工的食品或半成品、特殊的生物制品在经过收购、加工、灭活后&#xff0c;在产品加工、贮藏、运输、分销和零售、使用过程中&#xff0c;其各个环节始终处于产品所必需的特定低温环境下&#xff0c;减少损耗&#xff0c;防止污染和变质&#xf…

如何用私域流量让不知名新品牌大放异彩……

说到不知名品牌&#xff0c;那minayo这个品牌应该绝大部分人都没听说过&#xff0c;因为他从诞生到今天也就刚刚一年的时间。 minayo是一家功能性食品品牌&#xff0c;专注于美容类健康食品领域&#xff0c;主要为用户提供 AG 饮料、植物酵素、美白片、胶原蛋白果冻等产品。 …

基于区域的图像分割

文章目录 基于区域的图像分割基本原理常用的算法实现步骤示例代码结论 基于区域的图像分割 基于区域的图像分割是数字图像处理中常用的一种方法&#xff0c;它通过将图像中的像素分配到不同的区域或对象来实现图像分割的目的。相比于基于边缘或阈值的方法&#xff0c;基于区域…

汉明码奇偶校验矩阵理解

首先看 汉明码 一、矩阵解释 单bit纠正&#xff08; SEC&#xff0c;single error correction &#xff09; 以数据位为8位(m)为例&#xff0c;编码位数为r&#xff0c;2^r>mr1 r最小为4 编码后位数为4812位 编码位为p1&#xff0c;p2 &#xff0c;p3, p4 p1掌控&#xff…

数据分析真的很火吗?真的有很多企业需要这样的岗位吗?求大佬指点。

“我是去年毕业的&#xff0c;因为疫情影响&#xff0c;整个就业环境都很不好&#xff0c;很多企业都裁员了。加上疫情三年基本都是玩过去&#xff0c;也没啥一技之长&#xff0c;就业就更难了。听说现在做数据分析的人很多&#xff0c;我身边的朋友都在转行做数据分析。 其实…

【2023/05/15】Rust

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第10天。 Share Rest belongs to the work as the eyelids to the eyes. 译文&#xff1a; 休息与工作的关系&#xff0c;正如眼睑与眼睛的关系。 Man is a born child,his power is the power of gro…

华为od题库汇总分享

​ 前言 最近有很多群友问塔子哥华为最新OD题库在哪里可以找。我索性就写篇文章介绍一下吧~。这里塔子哥还是要说一下&#xff0c;大家想进华为od还是要重视题库。因为根据无数群友&#xff0c;网友的反映。华为od就是从题库里抽题&#xff0c;不会有新题。只是每个季度题库会…

使用mapbox+turf.js完成迁徙图,流向图教程

以前对于迁徙图流向图这样的需求大多都是采用echarts这样的图标组件库做的。这篇文章跟大家分享一下如何使用webgis的技术方式实现迁徙图,流向图这样的专题地图。 首先我们要把思路捋清楚,迁徙图表示的是从一个点出发向多个点均有流向(这个流向用线条表示)或者是从多个地方…

利用GPU并行计算beta-NTI,大幅减少群落构建计算时间

1 先说效果 18个样本&#xff0c;抽平到8500条序列&#xff0c;4344个OTUs&#xff0c;计算beta-NTI共花费时间如下。如果更好的显卡&#xff0c;更大的数据量&#xff0c;节约的时间应该更加可观。 GPU&#xff08;GTX1050&#xff09;&#xff1a;1分20秒 iCAMP包 的bNTIn.p(…