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]” 它的作用是,帮你绕…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...