C语言入门 Day_14 for循环

news2024/11/27 4:40:33

前言

我们定义了一个数组以后,要使用(读取或者修改)数组元素的话,可以一个一个的读取,就前两课学的那样,代码类似这个结构。

int number_list[5]={1,2,3,4,5};
printf("%d\n",number_list[0]);
printf("%d\n",number_list[1]);
printf("%d\n",number_list[2]);
printf("%d\n",number_list[3]);
printf("%d\n",numebr_list[4]);

假如我们对一个有10000个元素的数组,挨个打印输出他们的元素呢,难不成还要写一万行printf()?

这显然是不现实的。这种代码太多了,很容易出错,也很难维护。

这时候我们就要引入一种新的机制——循环,它可以按照我们意愿,反复执行同样的代码,直到满足边界条件

循环就像是一个没有感情的机器人,我们可以让它执行重复的枯燥的工作,当然这个工作需要步骤清晰。

比如图中1,打开抽屉;2,取出物品;3,关上抽屉。这三个动作重复但清晰,机器人会重复执行它们,直到取完所有抽屉里面的物品。

C语言中有多种循环的机制,我们今天学习第一种循环——for循环

1.for循环

1.1

自然界中,一直重复的四季更替,昼夜交替,阴晴圆缺叫做循环

在程序中,满足条件的情况下,反复执行同一段代码就叫做循环

下面代码会循环打印变量a的值,一共打印五次:

for(int a=0;a<5;a=a+1)
{
  printf(“变量的值是%d\n”,a);
}

1.for循环的语法格式——循环条件部分   for( int a = 0; a < 5; a = a + 1 )

2.for循环的代码块   {   printf("变量a的值是%d\n", a);   }

3.for循环的关键字——for

for(int a=0;a<5;a=a+1)
{
  printf(“变量的值是%d\n”,a);
}

4.for循环中的第一部分,初始定义    int a = 0

5.for循环中的第二部分,循环判断的条件   a<0

6.for循环中的第三部分,迭代操作  a=a+1

1.2

for(;;)

for循环的循环条件部分被两个分号分隔成了三个部分,它们分别是:

初始定义,循环判断条件,迭代操作

for循环的条件中,第一部分是在第一个分号之前,我们叫做初始定义;

比如这里定义了变量a,int a = 0 。

1.3

我们来填写一个for循环的判断条件中的初始定义int b = 10

for(int b=10;b<20;b++);


for循环的条件中,第二部分是在第一个分号之后,第二个分号之前,我们叫做循环的判断条件;

比如这里判断a < 5是否为真,如果为真,就执行循环中的代码块;如果为假就结束循环。

1.4

最后一部分是第二个分号之后的部分,是迭代动作,也是决定了要循环几次的地方;

如果没有变量的迭代动作,可能循环的判断条件永远为真,这就变成了无限循环或者死循环;

如果一次迭代动作是给变量增加5,那可能循环的判断条件只有第一次为真,迭代一次以后就为了,也就不再执行了。

填写for循环中的第三部分迭代操作b++

for(int b=10;b<20;b++);


同样是给变量增加1,我们一次使用了a = a + 1

一次使用了自增符号b++,两者效果是一样的。

1.5

for循环的代码块,和判断一样,for循环的代码块也是被花括号括起来的,只要判断条件符合,就会执行这个代码块。

我们来填入循环的代码块,打印b的值printf("b的值是%d\n", b);

for(int b = 10; b < 15; b++)
{
    printf("b的值是%d\n", b);
}

打印结果

10
11
12
13
14

 

1.6

for循环里面,第一部分是初始定义,定义变量的值;

第二部分是循环的判断条件,为真就执行代码块,为假就不执行;

第三部分是迭代动作,用以控制循环的执行次数

 

1.7

有了for循环,我们就可以让代码帮我们做哪些枯燥单调的重复动作了。比如我们就可以告诉机器人:

1,从第一个格子开始;

2,格子数小于9之前,都取出格子里的东西;

3,每次格子数增加1。

同时就像判断一样,我们也可以看到,循环的代码执行顺序,和顺序执行,条件执行,也是不一样的。

顺序执行是从上到下

条件执行是根据判断条件,只执行一部分分支的代码,但只会执行一次

循环执行则是会反复执行同一部分的代码。

2.循环执行顺序

2.1

计算机是个一板一眼的家伙,我们写出来的代码它都会默认按照从上到下的顺序执行。

比如这里的顺序执行:

int a=1;
int b=2;
int c=3;
printf("a的值是%d\n",a);
printf("b的值是%d\n",b);
printf("c的值是%d\n",c);

1.执行第一行  int a = 1;

2.执行第二行  int b = 2;

3.执行第三行  int c = 3;

int a=1;
int b=2;
int c=3;
printf("a的值是%d\n",a);
printf("b的值是%d\n",b);
printf("c的值是%d\n",c);

4.执行第四行  printf("a的值%d\n", a);

5.执行第五行  printf("b的值%d\n", b);

6.执行第六行  printf("c的值%d\n", c);

2.2

以及if-else判断语句中的选择执行,只执行某一个判断分支。

这里的判断语句只执行else分支:

int a=5;
if(a>5){
  printf("大于五\n");
}
else{
  printf("小于等于五\n");
}

然后我们来看看循环的代码执行顺序:

循环会反复执行代码块中的代码,直到循环条件不满足。

int number_list[5]={1,2,3,4,5};
for{int count=0;count<5;count++};{
  printf("%d\n",int numbrt_list[count])
}

1.执行的第一行,定义一个整形数组并赋值   int number_list[5] = {1, 2, 3, 4, 5}

2.for循环开始进行判断,判断为真,执行代码块的代码  for(int count = 0; count < 5; count++)

3.第一次执行代码块,用count变量直接当做数组下标使用  printf("%d\n", number_list[count]

4.第二次循环条件的判断  for(int count = 0; count < 5; count++)

5.第二次执行代码块,数组下标为1  printf("%d\n", number_list[count])

……

12. 第六次判断循环条件,count是5,判断条件count < 5不成立,终止循环

2.3

可以看到循环的代码执行特点

循环判断条件符合的时候,会反复执行代码块中的代码。

细到for循环里面也有小的执行顺序之分:

int number_list[5]={1,2,3,4,5};
for(int count=0;count<5;count++){
   printf("%d\n",number_list[count]);
}

1.执行到for循环

2.只有第一次才执行初始定义,也就是这里的定义一个变量  int count = 0

3.循环开始以后,先执行循环的判断条件  int number_list[5] = {1, 2, 3, 4, 5};

4.再执行代码块中的代码  printf("%d\n", number_list[count])

5.最后执行迭代操作的自增 count++

所以在for循环内部,首先执行初始条件的定义,这只会执行一次;

然后进行循环条件的判断,判断为真,执行代码块中的代码;

最后执行迭代操作

2.4

对于写代码和阅读代码的人来说,循环执行顺序的难点就已经不是代码的写法了,

而是循环中的代码块到底要执行几次,在什么条件下终止循环

我们去看需要执行几次循环中的代码块这件事情,一般都是自己心算一下或者用笔计算一下,有个大致的判断,以保证代码按照我们的需求来正确执行

同时循环和判断的代码块也是一样的,代码块中的代码作为一个整体,统一顺序执行,不能够分割出来;

所以也会用到花括号{}来定义代码块。

同时我们这里也应用了自增运算符,i++,来做迭代操作,这也是自增运算符最重要的应用场景

2.5

同时,我们用for循环,对数组中的每个元素进行了一次访问,我们就说完成了一次遍历

遍历是指对一个数组中的所有元素进行访问的操作。

3.易错点

 初始变量的定义也可以先在for循环外进行;

for(;;)会造成程序的死循环(无限循环),永远停不下来的循环。

4.思维导图

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

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

相关文章

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL移植

一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…

第二章 Linux多进程开发 2.24-2.31 信号集及相关函数 共享内存 守护进程

有时间需要重新回顾 2.24 信号集及相关函数 1.用户通过键盘 Ctrl C, 产生2号信号SIGINT (信号被创建) 2.信号产生但是没有被处理 &#xff08;未决&#xff09; - 在内核中将所有的没有被处理的信号存储在一个集合中 &#xff08;未决信号集&#xff09; - SIGINT信号状态被…

第 3 章 栈和队列 (利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径))

1. 背景说明 广度优先通俗的解释的是将当前所有能走的步骤全部走完并保存在队列中&#xff0c;又称为层序遍历&#xff0c;此外&#xff0c;该方法类似于多条路线并发前进&#xff0c; 哪一条先到就取哪条路线作为结果并终止查询&#xff0c;因此能够得到最短路径&#xff0c;…

【JavaEE】_HTML

目录 1.HTML结构 2. HTML常用标签 2.1 注释标签 2.2 标题标签&#xff1a;h1~h6 2.3 段落标签&#xff1a;p 2.4 换行标签&#xff1a;br 2.5 格式化标签 2.6 图片标签&#xff1a;img 2.7 超链接标签&#xff1a;a 2.8 表格标签 2.9 列表标签 2.10 表单标签 2.10…

镜像的基本命令(docker)

文章目录 前言一、docker命令介绍1、帮助命令2、显示镜像3、搜索镜像4、下载镜像5、删除镜像 总结 前言 本文主要介绍docker中与镜像相关的一些命令&#xff0c;是对狂神课程的一些总结&#xff0c;作为一个手册帮助博主和使用docker的同学们来查找和回忆。 实验环境&#xf…

【Java 基础篇】深入理解 Java 中的抽象类:提高代码可维护性与扩展性

抽象类&#xff08;Abstract Class&#xff09;是 Java 面向对象编程中的一个重要概念。它允许我们定义一组抽象方法&#xff0c;这些方法可以被子类&#xff08;类&#xff09;实现。抽象类通常用于定义一些通用的方法和属性&#xff0c;但不能被实例化。本篇博客将深入探讨 J…

Java反序列化漏洞复现(weblogic和s2)

文章目录 weblogic启动环境漏洞扫描漏洞复现 S2-045启动环境漏洞复现 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub weblogic 启动环境 到下面路径下…

Mac13.4 (22F66)钥匙串无法导出.p12证书解决方案

最近更新了Mac 13.4系统之后&#xff0c;开发苹果APP项目时突然发现无法导出.p12证书 这情况解决方案如下方案 在钥匙串访问的上方&#xff0c;有一栏类型筛选&#xff0c;默认选中的是 “所有项目”&#xff0c;将选项切换至“证书” 切换到“证书”后&#xff0c;右键点击需要…

Ae 效果:CC Vector Blur

模糊和锐化/CC Vector Blur Blur & Sharpen/CC Vector Blur CC Vector Blur&#xff08;CC 向量模糊&#xff09;使用源图像&#xff08;图层自身或指定的向量映射图层&#xff09;的亮度差异或其他选择的属性&#xff08;如红通道、绿通道、蓝通道等&#xff09;来生成一个…

kafka学习-概念与简单实战

目录 1、核心概念 消息和批次 Topic和Partition Replicas Offset broker和集群 生产者和消费者 2、开发实战 2.1、消息发送 介绍 代码实现 2.2、消息消费 介绍 代码实现 2.3、SpringBoot Kafka pom application.yaml KafkaConfig producer consumer 1、核心…

【变分法】【书籍阅读笔记】Calculus of Variation by gelfand 第一章 总结与习题题解 【更新中】

文章目录 前言1 第一章 变分法基础1.1 泛函 与 一些简单的变分问题1.2 Function Spaces/ 赋范线性空间1.3 泛函的变分: 具有极值的必要条件1. 重要引理/线性泛函的等零条件2. 泛函变分 1.4 最简单的变分问题&#xff1a;欧拉方程1. 欧拉方程2. 证明/欧拉方程的得出3. 欧拉方程的…

机器学习:基于梯度下降算法的线性拟合实现和原理解析

机器学习&#xff1a;基于梯度下降算法的线性拟合实现和原理解析 线性拟合梯度下降算法步骤算法实现数据可视化&#xff08;动态展示&#xff09;应用示例 当我们需要寻找数据中的趋势、模式或关系时&#xff0c;线性拟合和梯度下降是两个强大的工具。这两个概念在统计学、机器…

SQLI-labs-第五关

知识点&#xff1a;布尔盲注 思路&#xff1a; 1、判断注入点 首先&#xff0c;我们看看正常的回显内容 ?id1 接着输入?id1 &#xff0c;结果出现语句错误 这里说明存在单引号的闭合错误 ?id1 and 11-- ?id1 and 12-- 这里没有任何回显信息&#xff0c;可以准确的确…

基于STM32程序万年历液晶1602显示-proteus仿真-源程序

一、系统方案 本设计采用STM32单片机作为主控器&#xff0c;液晶1602显示&#xff0c;按键设置万年历。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 //通用定时器3中断初始化 //这里时钟选择为APB1的2倍&#xff0c;而APB1为36M //arr&…

官方YOLOV5的torch模型->ONNX模型->RKNN模型

1、环境配置 1.1 RKNN Toolkit2的环境配置 下载RKNN Toolkit2 git clone https://github.com/rockchip-linux/rknn-toolkit2.git打开一个终端命令行窗口,安装 Python3.6 和 pip3 sudo apt-get install python3 python3-dev python3-pip安装所需的依赖包 sudo apt-get inst…

机器学习笔记之最优化理论与方法(七)无约束优化问题——常用求解方法(上)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[上] 引言总体介绍回顾&#xff1a;线搜索下降算法收敛速度的衡量方式线性收敛范围高阶收敛范围 二次终止性朴素算法&#xff1a;坐标轴交替下降法最速下降法(梯度下降法)梯度下降法的特点 针对最速下降法缺…

Vue + Element UI 前端篇(十二):用户管理模块

Vue Element UI 实现权限管理系统 前端篇&#xff08;十二&#xff09;&#xff1a;用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…

Unity中Shader的变体shader_feature

文章目录 前言一、变体的类型1、multi_compile —— 无论如何都会被编译的变体2、shader_feature —— 通过材质的使用情况来决定是否编译的变体 二、使用 shader_feature 来控制 shader 效果的变化1、首先在属性面板暴露一个开关属性&#xff0c;用于配合shader_feature来控制…

解决deepspeed框架的bug:不保存调度器状态,模型训练重启时学习率从头开始

deepspeed存在一个bug&#xff0c;即在训练时不保存调度器状态&#xff0c;因此如果训练中断后再重新开始训练&#xff0c;调度器还是会从头开始而不是接着上一个checkpoint的调度器状态来训练。这个bug在deepspeed的github中也有其他人提出&#xff1a;https://github.com/mic…

清理Maven仓库中下载失败的文件

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…