当前位置: 首页 > news >正文

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语言学习笔记】

高质量博主&#xff0c;点个关注不迷路&#x1f338;&#x1f338;&#x1f338;&#xff01; 目录 I. 案例引入 II. while语句 III. do while语句 IV. for语句 前言: 书接上回&#xff0c;判断结构已经解决&#xff0c;接下来是另一种很重要的结构&#xff1a;循环结构的实…...

JavaScript高级程序设计读书分享之4章——4.3垃圾回收

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 4.3.3 性能 垃圾回收程序会周期性运行&#xff0c;如果内存中分配了很多变量&#xff0c;则可能造成性能损失&#xff0c;因此垃圾回收的 时间调度很重要。尤其是在内存有限的移动设备上&#xff0c;垃圾…...

Java线程的6 种状态

Java 线程的状态 Java线程有六种状态&#xff1a; 初始&#xff08;NEW&#xff09;、运行&#xff08;RUNNABLE&#xff09;、阻塞&#xff08;BLOCKED&#xff09;、 等待&#xff08;WAITING&#xff09;、超时等待&#xff08;TIMED_WAITING&#xff09;、终止&#xff08…...

5年测试在职经验之谈:3年手工测试、2年的自动化测试,从入门到不可自拔...

毕业3年了&#xff0c;学的是环境工程专业&#xff0c;毕业后零基础转行做软件测试。 已近从事测试行业8年了&#xff0c;自己也从事过3年的手工测试&#xff0c;从事期间越来越觉得如果一直在手工测试的道路上前进&#xff0c;并不会有很大的发展&#xff0c;所以通过自己的努…...

QHash-官翻

QHash 类 template <typename Key, typename T> class QHash QHash 类是一种模板类&#xff0c;提供基于哈希表的字典类结构。更多内容… 头文件:#include <QHash>qmake:QT core派生类:QMultiHash 所有成员列表&#xff0c;包括继承的成员废弃的成员 注意&…...

MYSQL 配置优化

max_connections 允许客户端并发连接的最大数量&#xff0c;默认值是151。 show status like %connections%; 设置参数值应大于Max_used_connections。如果使用连接池&#xff0c;可参考连接池的最大连接数和每个连接池的数量作为参考设置 innodb_buffe_pool_instances Inno…...

多 态

1多态的基本概念多态是C面向对象三大特性之一多态分为两类静态多态: 函数重载和运算符重载属于静态多态&#xff0c;复用函数名动态多态: 派生类和虚函数实现运行时多态静态多态和动态多态区别:静态多态的函数地址早绑定–--编译阶段确定函数地址动态多态的函数地址晚绑定–--运…...

Java集合

集合、数组都是对多个数据进行存储操作的结构&#xff0c;简称java容器 &#xff08;此时的存储&#xff0c;主要指的是内存层面的存储&#xff0c;不涉及持久化的存储&#xff09; 数组存储的特点&#xff1a; 一旦初始化&#xff0c;其长度就确定了。数组一旦定义好&#x…...

高校借力泛微,搭建一体化、流程化的​内控管理平台

财政部《行政事业单位内部控制规范&#xff08;试行&#xff09;》中明确规定&#xff1a;行政事业单位内部控制是指通过制定制度、实施措施和执行程序&#xff0c;实现对行政事业单位经济活动风险的防范和管控&#xff0c;包括对其预算管理、收支管理、采购管理、资产管理、建…...

使用人工智能赚钱的方式,行业领域有哪些?

使用人工智能赚钱的方式&#xff0c;行业领域有哪些&#xff1f;不少于2000字。 一、人工智能的应用领域 1、金融服务&#xff1a;金融服务行业是人工智能应用的领域之一&#xff0c;它可以帮助银行、信用卡公司等金融机构实现快速、有效的贷款审批&#xff0c;以及客户分析、…...

【数组中重复的数字】-C语言-题解

原题链接&#xff1a;数组中重复的数字 一、描述&#xff1a; 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数…...

C++调用Python脚本进行18次循环操作后,脚本不执行

C调用Python脚本进行18次循环操作后&#xff0c;脚本不执行 现象&#xff1a; 发送端接收端 从第二张图中可以看出&#xff0c;python脚本卡在’[parkin_debug] 6’与’[parkin_debug] 7’之间 该测试经过多次反复测试&#xff0c;均在第18次循环执行时&#xff0c;出现上述问…...

字节10年架构师职业发展经历,助你做好职业规划

一直以来程序员这一职业都给人高薪资的印象&#xff0c;近年来随着互联网行业的快速发展&#xff0c;程序员更是人满为患&#xff0c;然而很多人关注的却是程序员的薪资&#xff0c;而非职业本身。 一批批程序员进入工作岗位&#xff0c;但是很多人并没有对自己的职业生涯有清…...

ArrayList真的是因为实现了RandomAccess接口才能做到快速随机访问的吗

ArrayList和RandomAccess接口RandomAccess 接口Collections.binarySearch()源码总结RandomAccess 接口 首先&#xff0c;RandomAccess接口是什么&#xff0c;以下代码可见&#xff1a; public interface RandomAccess { }RandomAccess接口其实是一个标记接口&#xff0c;它只…...

OSI七层模型与物理层与设备链路层

目录 协议 举例 OSI七层模型 理解七层模型 以下为OSI七层模型数据逐层封装和数据逐层解封的过程 TCP/IP参考模型 数据包的层层封装与层层拆包 各层的数据以及协议 封装所用的协议的数字表示形式 物理层 模拟信号 模拟信号特点 数字信号 数字信号特点 数据通信模…...

Java8的Optional类的使用 和 Stream流式操作

Java知识点总结&#xff1a;想看的可以从这里进入 目录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协议的认证、授权系统&#xff0c;除了标准的Oauth2授权流程功能外&#xff0c;还提供了应用管理、用户管理、权限管理等相关功能。 在这个项目中你能够了解到如何基于spring-security-oauth2-authorization-server实现自己的Authorizat…...

研制过程评审活动(五)生产定型阶段

1. 生产定型阶段主要任务 生产定型的主要任务是对产品批量生产条件和质量稳定情况进行全面考核,以确认产品是否达到批量生产的标准。   需要生产定型的军工产品,在完成设计定型并经小批量试生产后、正式批量生产之前,进行生产定型。生产定型的条件和时间,由定委在批准设计…...

NCUT加权的NMF

矩阵定义 X&#xff1a;特征矩阵&#xff0c;矩阵的维度为体素数mx&#xff08;指标数x被试数&#xff09;n S&#xff1a;相似性矩阵&#xff0c;由特征矩阵的每一行计算皮尔逊相关得到mxm的方阵 D&#xff1a;度矩阵&#xff0c;度矩阵的对角线元素由相似性矩阵S对应的行和…...

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]” 它的作用是&#xff0c;帮你绕…...

vue3中使用jszip压缩文件

1、安装依赖 npm install jszip npm install file-saver --save 2、使用 <template><el-card class"mb15"><template #header><span>jszip</span></template><!-- 二维码容器 --><div id"qrCodeBox">&…...

React 虚拟DOM的前世今生

引文 通过本文你将了解到 什么是虚拟DOM&#xff1f;虚拟DOM有什么优势&#xff1f;React的虚拟Dom是如何实现的&#xff1f;React是如何将虚拟Dom转变为真实Dom&#xff1f; 一、前言 要了解虚拟DOM&#xff0c;我们先明确一下DOM的概念。 根据MDN的说法&#xff1a; 文档…...

Java环境变量配置

一、Path环境变量配置设置环境变量的值&#xff1a;C:\Program Files\Java\jdk-17\bin目前较新的JDK安装时会自动配置javac、java程序的路径到Path环境变量中去 &#xff0c;因此&#xff0c;javac、java可以直接使用。注意&#xff1a;以前的老版本的JDK在安装的是没有自动配置…...

超详细解读!数据库表分区技术全攻略

更多内容可以关注微信公众号&#xff1a;老程序员刘飞 分区的定义 分区是一种数据库优化技术&#xff0c;它可以将大表按照一定的规则分成多个小表&#xff0c;从而提高查询和维护的效率。在分区的过程中&#xff0c;数据库会将数据按照分区规则分配到不同的分区中&#xff0…...

Redis高可用集群方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 @[TOC](文章目录)主从复制哨兵模式(sentinel)Cluster集群在生产过程中,Redis不一定会单独部署。因为一旦redis服务因为某些原因导致无法提供数,那么redis就不可用了。那么实现redis高可用的方式就…...

企业微信机器人发送消息

前言 随着科技的发展,各企业公司的业务不断发展,那么就需要强有力的沟通软件,其中企业微信、钉钉的能力得到了大众的认可,今天这篇文章就讲其中的一个功能-调用企业微信机器人(下文简称应用)进行消息传递。它的好处有哪些呢?自然是可以让相关人员及时追踪任务进度。 一、…...

使用PHP+yii2调用asmx服务接口

一.创建服务端 1&#xff1a;创建一个ASP.NET web应用程序 2:选择空的模板 3&#xff1a;系统生成项目目录 4&#xff1a;右键项目-添加项-新建项 5&#xff1a;选择Web 服务&#xff08;ASMX&#xff09; 6&#xff1a;选择之后项目中会有一个Test.asmx服务程序&#xff0c;…...

【042】904. 水果成篮[滑动窗口]

你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按照要求采摘水果&…...

Linux基础知识(一)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

Redis面试题

目录 Redis持久化机制:RDB和AOF Redis线程模型有哪些&#xff1f;单线程为什么快&#xff1f; Redis的过期键有哪些删除策略&#xff1f; Redis集群方案有哪些&#xff1f; redis事务怎么实现&#xff1f; 为什么redis不支持回滚&#xff1f; redis主从复制的原理是什么 …...