C语言学习_DAY_5_循环结构while和for语句【C语言学习笔记】
高质量博主,点个关注不迷路🌸🌸🌸!
目录
I. 案例引入
II. while语句
III. do while语句
IV. for语句
前言: 书接上回,判断结构已经解决,接下来是另一种很重要的结构:循环结构的实现,在C语言中,有两种循环结构的实现方式,一种是用while语句实现,另一种则是通过for语句实现,我们在本篇笔记中对两种语句进行讲解。
I. 案例引入
首先,我们理解为什么我们需要循环结构,我们看这样一个需求:
现在我想要输出从1到100,总计一百个数字,我们要如何实现呢?
方法一:手写一百条printf()语句
但显然方法一不可取,因为方法一产生了庞大的代码量,既不利于编写程序,也不利于阅读和纠错,并且当我更改需求时,例如从1到10000,则会导致程序无法被快速的修改。
方法二:使用一种循环的结构,循环一百次,每次循环输出一个数字。
显然,方法二才是我们需要的方法,同时引出了我们的学习目标:while和for两种循环语句。
II. while语句
首先介绍第一种实现循环的语句:while语句
while语句的语法格式是这样的:
while(条件表达式){
当条件表达式为真时,会循环执行的内容
}
看到这个格式定义之后,我们先思考一个问题:
假设有这样的一段程序:
#include<stdio.h>int main(){int a = 3;while(a > 0){printf("%d\n",a);}return 0;
}
这段程序执行后,会发生什么呢?我们分析一下:
首先,a被赋值3,而后进入while语句,while判断a是否大于零,而很显然,a是大于零的,于是执行while语句内部的执行内容,是打印a的值,打印之后,又进行下一次判断,但是,由于a的值并没有发生修改,所以这个循环会一直执行下去,也就是说,它会一直输出a的值3:

当出现这种情况时,往往是因为我们的判断表达式中的变量在循环中并没有修改,进而引发了无限的循环,我们通常称之为死循环。
死循环是一种错误,我们需要避免它,避免的方法就是要确保我们的条件表达式中的变量会随着循环的执行而修改。
例如我们要实现打印1到100,一百个数字,可以这么写:
#include<stdio.h>int main(){int a = 1;while(a <= 100){printf("%d\n",a);a++;} return 0;
}
这段程序中,当每一次循环在执行的过程中,while的判断表达式的变量a的值都在自增,于是我们就实现了破除死循环的效果,当a的值增加到101时,由于不满足a <= 100,循环发生了终止。
III. do while语句
学习了while循环语句后,我们介绍它的一个变种,叫do while语句。do while语句有什么作用呢?我们先看一个例子:
#include<stdio.h>int main(){int a = 1;while(a < 0){printf("%d\n",a);} return 0;
}
上面是一段while循环的例子,这个例子中,a的值是1,而while的判断条件是a<0,于是乎循环一次也不会执行,即我们运行后没有任何效果:

现在我提出需求: 还是上面的这段程序,不修改while的条件表达式,也不修改a的值,如何让这个循环执行一次,而后退出呢?这就引入了do-while语句:
do{
会先执行一次,而后检查while中的条件表达式,如果符合条件,则继续循环,否则退出
} while(条件表达式);
也就是说,使用了do-while时,无论条件是否成立,do中的语句会先执行一次,而后才进行判断;当第一次无条件执行过后,do-while的逻辑完全等价于while,即条件成立则继续执行,否则退出循环。于是上面的需求可以用下面的代码实现:
#include<stdio.h>int main(){int a = 1;do{printf("%d",a);}while(a < 0);return 0;
}
这段代码执行之后,会输出一次a,而后由于不满足条件,退出了循环:

IV. for语句
介绍完了while循环语句之后,我们介绍另一种循环语句:for语句,for语句相较于while,具有更高的灵活度,但相应的,格式也会更复杂一些,我们先看一下它的通用格式:
for(表达式1;表达式2;表达式3){
循环体
}
看这个通用格式,其实看不出它的执行逻辑,因此我们再进一步深究一下:
表达式1:表达式1通常是用来做一些对变量赋值的操作,这些变量往往是控制循环执行次数的变量,例如我们使用变量a作为控制循环执行次数的变量,那么表达式1可以是:a = 1
表达式2: 表达式2是用来判断循环是否能够继续执行下去的判定式,例如我们可以写: a < 10,表示当a小于10时,循环继续执行
表达式3: 表达式3一般用来对控制循环执行次数的变量的值进行修改,以便跳出循环,避免死循环的发生。
那么这三个表达式,和循环体,它们的执行次序是怎么样的呢?
表达式1(只会执行一次) - - - > 表达式2 - - - > 循环体 - - - > 表达式3
也就是说,表达式3,对变量值的修改,发生在循环体之后,但很多新手认为三个表达式是先执行的,而后执行循环体,因此我们可以用一段代码验证表达式3确实在循环体之后执行:
#include<stdio.h>int main(){int a;for(a = 1;a >= 1 ; a --){printf("a = %d",a);}return 0;
}
上面这段代码很有意思,如果说,表达式3先于循环体执行,也就是按照:
表达式1(只会执行一次) - - - > 表达式2 - - - > 表达式3 - - - > 循环体
这样的顺序执行,那么我们分析一下输出的a的值:
表达式1执行后,a = 1
表达式2执行后,a = 1 不变
表达式3执行后,a = a - 1 = 0
于是输出结果为0,但我们运行代码发现:

因而我们证明了循环体确实在表达式3之前执行,也即for循环三个表达式与循环体执行顺序应该为:
表达式1(只会执行一次) - - - > 表达式2 - - - > 循环体 - - - > 表达式3 (牢记次序)
另外补充一个细节:
在C语言中,"通常" 不支持在表达式1中对变量进行声明,而只可以赋值,即不支持:
int a = 1
而支持
a = 1
因此我们通常是这样写的:
#include<stdio.h>int main(){int a;for(a = 1;a >= 1 ; a --){printf("a = %d",a);}return 0;
}
即先声明a,而后在for中进行赋值操作(当然,现在的编译器可能支持在for中第一个表达式里定义,但通常不这样写。)
那到这里,循环语句也已学习完成,我们继续向C语言入门冲锋!
相关文章:
C语言学习_DAY_5_循环结构while和for语句【C语言学习笔记】
高质量博主,点个关注不迷路🌸🌸🌸! 目录 I. 案例引入 II. while语句 III. do while语句 IV. for语句 前言: 书接上回,判断结构已经解决,接下来是另一种很重要的结构:循环结构的实…...
JavaScript高级程序设计读书分享之4章——4.3垃圾回收
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 4.3.3 性能 垃圾回收程序会周期性运行,如果内存中分配了很多变量,则可能造成性能损失,因此垃圾回收的 时间调度很重要。尤其是在内存有限的移动设备上,垃圾…...
Java线程的6 种状态
Java 线程的状态 Java线程有六种状态: 初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、 等待(WAITING)、超时等待(TIMED_WAITING)、终止(…...
5年测试在职经验之谈:3年手工测试、2年的自动化测试,从入门到不可自拔...
毕业3年了,学的是环境工程专业,毕业后零基础转行做软件测试。 已近从事测试行业8年了,自己也从事过3年的手工测试,从事期间越来越觉得如果一直在手工测试的道路上前进,并不会有很大的发展,所以通过自己的努…...
QHash-官翻
QHash 类 template <typename Key, typename T> class QHash QHash 类是一种模板类,提供基于哈希表的字典类结构。更多内容… 头文件:#include <QHash>qmake:QT core派生类:QMultiHash 所有成员列表,包括继承的成员废弃的成员 注意&…...
MYSQL 配置优化
max_connections 允许客户端并发连接的最大数量,默认值是151。 show status like %connections%; 设置参数值应大于Max_used_connections。如果使用连接池,可参考连接池的最大连接数和每个连接池的数量作为参考设置 innodb_buffe_pool_instances Inno…...
多 态
1多态的基本概念多态是C面向对象三大特性之一多态分为两类静态多态: 函数重载和运算符重载属于静态多态,复用函数名动态多态: 派生类和虚函数实现运行时多态静态多态和动态多态区别:静态多态的函数地址早绑定–--编译阶段确定函数地址动态多态的函数地址晚绑定–--运…...
Java集合
集合、数组都是对多个数据进行存储操作的结构,简称java容器 (此时的存储,主要指的是内存层面的存储,不涉及持久化的存储) 数组存储的特点: 一旦初始化,其长度就确定了。数组一旦定义好&#x…...
高校借力泛微,搭建一体化、流程化的内控管理平台
财政部《行政事业单位内部控制规范(试行)》中明确规定:行政事业单位内部控制是指通过制定制度、实施措施和执行程序,实现对行政事业单位经济活动风险的防范和管控,包括对其预算管理、收支管理、采购管理、资产管理、建…...
使用人工智能赚钱的方式,行业领域有哪些?
使用人工智能赚钱的方式,行业领域有哪些?不少于2000字。 一、人工智能的应用领域 1、金融服务:金融服务行业是人工智能应用的领域之一,它可以帮助银行、信用卡公司等金融机构实现快速、有效的贷款审批,以及客户分析、…...
【数组中重复的数字】-C语言-题解
原题链接:数组中重复的数字 一、描述: 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数…...
C++调用Python脚本进行18次循环操作后,脚本不执行
C调用Python脚本进行18次循环操作后,脚本不执行 现象: 发送端接收端 从第二张图中可以看出,python脚本卡在’[parkin_debug] 6’与’[parkin_debug] 7’之间 该测试经过多次反复测试,均在第18次循环执行时,出现上述问…...
字节10年架构师职业发展经历,助你做好职业规划
一直以来程序员这一职业都给人高薪资的印象,近年来随着互联网行业的快速发展,程序员更是人满为患,然而很多人关注的却是程序员的薪资,而非职业本身。 一批批程序员进入工作岗位,但是很多人并没有对自己的职业生涯有清…...
ArrayList真的是因为实现了RandomAccess接口才能做到快速随机访问的吗
ArrayList和RandomAccess接口RandomAccess 接口Collections.binarySearch()源码总结RandomAccess 接口 首先,RandomAccess接口是什么,以下代码可见: public interface RandomAccess { }RandomAccess接口其实是一个标记接口,它只…...
OSI七层模型与物理层与设备链路层
目录 协议 举例 OSI七层模型 理解七层模型 以下为OSI七层模型数据逐层封装和数据逐层解封的过程 TCP/IP参考模型 数据包的层层封装与层层拆包 各层的数据以及协议 封装所用的协议的数字表示形式 物理层 模拟信号 模拟信号特点 数字信号 数字信号特点 数据通信模…...
Java8的Optional类的使用 和 Stream流式操作
Java知识点总结:想看的可以从这里进入 目录13.6、Optional类13.7、Stream13.7.1、Stream创建13.7.2、中间操作1、筛选2、切片3、映射4、排序13.7.3、终止操作1、遍历2、聚合3、匹配查找4、归约5、收集归集统计分组字符串拼接归约13.6、Optional类 Optional类是一个…...
Authorization Server 认证服务
Hi Auth HiAuth是一个开源的基于Oauth2协议的认证、授权系统,除了标准的Oauth2授权流程功能外,还提供了应用管理、用户管理、权限管理等相关功能。 在这个项目中你能够了解到如何基于spring-security-oauth2-authorization-server实现自己的Authorizat…...
研制过程评审活动(五)生产定型阶段
1. 生产定型阶段主要任务 生产定型的主要任务是对产品批量生产条件和质量稳定情况进行全面考核,以确认产品是否达到批量生产的标准。 需要生产定型的军工产品,在完成设计定型并经小批量试生产后、正式批量生产之前,进行生产定型。生产定型的条件和时间,由定委在批准设计…...
NCUT加权的NMF
矩阵定义 X:特征矩阵,矩阵的维度为体素数mx(指标数x被试数)n S:相似性矩阵,由特征矩阵的每一行计算皮尔逊相关得到mxm的方阵 D:度矩阵,度矩阵的对角线元素由相似性矩阵S对应的行和…...
从0开始的ios自动化测试
最近由于工作内容调整,需要开始弄ios自动化了。网上信息有点杂乱,这边我就按我的实际情况,顺便记录下来,看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]” 它的作用是,帮你绕…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
