一篇讲清楚Java for循环详解

news2024/9/27 5:58:34

for 语句是应用最广泛、功能最强的一种循环语句。大部分情况下,for 循环可以代替 while 循环、do while 循环。

for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假,那么它的循环语句根本不会执行。for 语句通常使用在知道循环次数的循环中。

for 语句语法格式如下所示。

for(条件表达式1;条件表达式2;条件表达式3) {
    语句块;
}

for 循环中 3 个条件表达式的含义如表 1 所示。

表 1 for 循环中 3 个表达式的含义
表达式形式功能举例
条件表达式 1赋值语句循环结构的初始部分,为循环变量赋初值int i=1
条件表达式 2条件语句循环结构的循环条件i>40
条件表达式 3迭代语句,通常使用
++ 或 -- 运算符
循环结构的迭代部分,通常用来修改循环
变量的值
i++


for 关键字后面括号中的 3 个条件表达式必须用“;”隔开。for 循环中的这 3 部分以及大括号中使循环体必需的 4 个组成部分完美地结合在一起,简单明了。

for 循环语句执行的过程为:首先执行条件表达式 1 进行初始化,然后判断条件表达式 2 的值是否为 true,如果为 true,则执行循环体语句块;否则直接退出循环。最后执行表达式 3,改变循环变量的值,至此完成一次循环。接下来进行下一次循环,直到条件表达式 2 的值为 false,才结束循环,其运行流程如图 1 所示。
 



图 1  for循环执行流程图


值得指出的是,for 循环的循环迭代语句并没有与循环体放在一起,因此即使在执行循环体时遇到 continue 语句结束本次循环,循环迭代语句也一样会得到执行。

for 循环和 while、do while 循环不一样:由于 while、do while 循环的循环迭代语句紧跟着循环体,因此如果循环体不能完全执行,如使用 continue 语句来结束本次循环,则循环迭代语句不会被执行。但 for 循环的循环迭代语句并没有与循环体放在一起,因此不管是否使用 continue 语句来结束本次循环,循环迭代语句一样会获得执行。

与前面循环类似的是,如果循环体只有一行语句,那么循环体的大括号可以省略。

例如,同样是计算 5 的阶乘,使用 for 循环的实现代码如下:

 
  1. public static void main(String[] args) {
  2. int result = 1;
  3. for (int number = 1; number <= 5; number++) {
  4. result *= number;
  5. }
  6. System.out.print("5 的阶乘结果是:" + result); // 输出"5的阶乘结果是:120"
  7. }

上述语句的含义可以理解为,将 number 变量的值从 1 开始,每次递增 1,直到大于 5 时终止循环。在循环过程中,将 number 的值与当前 result 的值进行相乘。

for 语句中初始化、循环条件以及迭代部分都可以为空语句(但分号不能省略),三者均为空的时候,相当于一个无限循环。下面对这些情况依次进行介绍。

1.条件表达式 1 为空

for 语句中条件表达式 1 的作用可以在程序的其他位置给出,所以当条件表达式 1 为空时,for 语句后面括号内其他条件表达式执行的顺序不变。

例如,使用 for 语句的这种形式计算 1~100 所有奇数的和。

 
  1. public static void main(String[] args) {
  2. int result = 0;
  3. int number = 1; // 相当于for语句的第1个表达式
  4. for (; number < 101; number++) {
  5. if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
  6. result += number;
  7. }
  8. System.out.print("100 以内所有奇数和为:" + result);
  9. }

执行后的输出结果如下:

100 以内所有奇数和为:2500
2.条件表达式 2 为空

当 for 语句中条件表达式 2 为空时,将没有循环的终止条件。此时 for 语句会认为条件表达式 2 的值总是为真,循环无限制执行下去。因此,为了使循环达到某种条件时退出,需要在语句块中进行逻辑判断,并使用 break 语句来跳出循环,否则将产生死循环。

同样是计算 1~100 所有奇数的和,使用这种方式的代码如下。

 
  1. public static void main(String[] args) {
  2. int result = 0;
  3. for (int number = 1;; number++) {
  4. if (number > 100)
  5. break; // 相当于for语句的表达式2,满足时就退出for循环
  6. if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
  7. result += number;
  8. }
  9. System.out.print("100 以内所有奇数和为:" + result);
  10. }
3.条件表达式 3 为空

当 for 语言中条件表达式 3 为空时,也就没有设置控制变量的表达式,即每次循环之后无法改变变量的值,此时也无法保证循环正常结束。

同样是计算1~100 所有奇数的和,使用这种方式的代码如下:

 
  1. public static void main(String[] args) {
  2. int result = 0;
  3. for (int number = 1; number < 101;) {
  4. if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
  5. result += number;
  6. number++; // 相当于for语句的条件表达式3,每次递增1
  7. }
  8. System.out.print("100 以内所有奇数和为:" + result);
  9. }

如果没有循环体语句,number 变量的值为 1,永远小于 101,因此将无法结束循环,形成无限循环。在上面代码中将 number 的递增语句放在 for 循环体内,效果与完整 for 语句功能相同。

4.3 个条件表达式都为空

在 for 循环语句中,无论缺少哪部分条件表达式,都可以在程序的其他位置补充,从而保持 for 循环语句的完整性,使循环正常进行。

当 for 语句中循环体全为空时,即没有循环初值,不判断循环条件,循环变量不增值,此时无条件执行循环体,形成无限循环或者死循环。对于这种情况,读者在使用时应该尽量避免。

例如,计算 1~100 所有奇数的和,使用这种方式的代码如下: 

 
  1. public static void main(String[] args) {
  2. int result = 0;
  3. int number = 1; // 相当于for语句的条件表达式1
  4. for (;;) {
  5. if (number > 100)
  6. break; // 相当于for语句的条件表达式2
  7. if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
  8. result += number;
  9. number++; // 相当于for语句的条件表达式3
  10. }
  11. System.out.print("100 以内所有奇数和为: " + result);
  12. }
例 1

编写一个 java 程序,统计某超市上半年的总销售量,要求由用户输入每月的销量。使用 for 循环的实现代码如下。

 
  1. public static void main(String[] args) {
  2. int sum = 0;
  3. int num = 0;
  4. Scanner sc = new Scanner(System.in);
  5. for (int i = 1; i <= 6; i++) {
  6. System.out.println("请输入第" + i + " 个月的销售数量:");
  7. num = sc.nextInt();
  8. sum += num;
  9. }
  10. System.out.println("上半年的销售总量为:" + sum);
  11. }

在该程序中, 声明循环变量 i,控制循环的次数,它被初始化为 1。每执行一次循环,都要对 i 进行判断,看其值是否小于等于 6,条件成立则继续累加成绩,否则退出循环。

每执行完一次循环体,都会对 i 累加 1。如此循环重复,直到 i 的值大于 6 时停止循环。此时退出 for 循环体,执行最下方的语句输出累加的销售总量。

运行程序,执行结果如下所示。

请输入第1 个月的销售数量:
6840
请输入第2 个月的销售数量:
5449
请输入第3 个月的销售数量:
6546
请输入第4 个月的销售数量:
2400
请输入第5 个月的销售数量:
908
请输入第6 个月的销售数量:
8048
上半年的销售总量为:30191

一般选择循环变量时,习惯选择 i、j、k 来作为循环变量。

for、do-while 和 while 的区别

​ 在《Java while和do while循环》中我 ​们学习了 do-while 和 while 循环,这一节我们又学习了 for 循环。关于 do-while 和 while 具体的相同点和不同点在刚刚提到的教程中已经介绍过了,在这里不过多讲解了。下面主要介绍它们的区别,如下表 2 所示。


表 2 for、do-while和while的区别
名称概念适用场景特点
for根据循环次数限制做多少次重复操作适合循环次数是已知的操作
  • 初始化的条件可以使用局部变量和外部变量
  • 使用局部变量时,控制执行在 for 结束后会自动释放,提高内存使用效率。
  • 且变量在 for 循环结束后,不能被访问。
  • 先判断,再执行
while当满足什么条件的时候,才做某种操作适合循环次数是未知的操作
  • 初始化的条件只能使用外部变量,且变量在 while 循环结束后可以访问
  • 先判断,再执行
do-while先执行一次,在判断是否满足条件适合至少执行一次的循环操作
  • 在先需要执行一次的情况下,代码更加简洁。
  • 先执行一次,再判断
例 2

分别用 for、do-while 和 while 求出 1-10 的和。

1)使用for循环

代码如下:

 
  1. public static void main(String[] args) {
  2. int sum = 0;
  3. for (int i = 1; i < 11; i++) {
  4. sum = sum + i;
  5. }
  6. System.out.println(sum);
  7. }

运行结果为 55。

2)使用 do-while 循环

代码如下:

 
  1. public static void main(String[] args) {
  2. int sum = 0;
  3. int i = 1;
  4. do {
  5. sum = sum + i;
  6. i++;
  7. } while (i < 11);
  8. System.out.println(sum);
  9. }

运行结果为 55。

3)使用 while 循环

代码如下:

  1. public static void main(String[] args) {
  2. int sum = 0;
  3. int i = 1;
  4. while (i < 11) {
  5. sum = sum + i;
  6. i++;
  7. }
  8. System.out.println(sum);
  9. }

运行结果为 55。

从上边代码可以看出 for 语句明显更加简练,因为知道循环次数。 

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

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

相关文章

七个有用的 GIT 命令

在这篇文章中&#xff0c;我将与你分享7个 GIT 命令。 它们是有用的简短命令&#xff0c;但有时我们会错过它们。 01、查看之前的分支 我们将从一个非常短的 git 命令开始这个列表。 有时&#xff0c;我们在分支机构工作。 对于某些季节&#xff0c;我们需要切换到另一个分支…

图片批量处理:将长图切割成短图,轻松高效!

在日常生活中&#xff0c;我们经常需要处理大量的图片&#xff0c;包括上传和下载的图片。有时候&#xff0c;我们可能需要将这些长图切割成几个短图&#xff0c;以便更好地管理和使用。但是&#xff0c;如何快速高效地完成这个任务呢&#xff1f;今天&#xff0c;我们将向你介…

ViewPager、RecycleView实现轮播图

1.ViewPager实现轮播图形效果。 1&#xff09;layout中&#xff0c;PageIndicatorView轮播的View <RelativeLayoutandroid:layout_width"match_parent"android:layout_height"200dp"android:orientation"vertical"><androidx.viewpager…

nio 文件传输

transferto方法一次只能传输2个g的数据 文件大于2个g时

双十一孩子护眼台灯应该怎么选?2023好用护眼台灯推荐

在快节奏的生活中&#xff0c;孩子的压力越来越大&#xff0c;越来越需要良好的光线进行学习&#xff0c;越来越多的家长考虑到孩子的视力问题&#xff0c;选择购买护眼台灯来为孩子提供良好舒适的光线环境&#xff0c;选择一款舒适的护眼台灯尤为重要&#xff0c;那么&#xf…

fastadmin 后台列表数据多表查询筛选

记录一下fastadmin后台列表数据连表查询筛选提示&#xff1a; 1&#xff1a;下拉框方式搜索 示例&#xff1a; 在对应js文件中添加如下代码&#xff1a; 代码&#xff1a; {field: s.area_id,title: __(所属片区),visible: false,//不显示在列表中operate: ,searchList: $.…

3.2.OpenCV技能树--二值图像处理--图像腐蚀与膨胀

文章目录 1.文章内容来源2.图像膨胀处理2.1.图像膨胀原理简介2.2.图像膨胀核心代码2.3.图像膨胀效果展示 3.图像腐蚀处理3.1.图像腐蚀原理简介3.2.图像腐蚀核心代码3.3.图像腐蚀效果展示 4.易错点总结与反思 1.文章内容来源 1.题目来源:https://edu.csdn.net/skill/practice/o…

芥墨 | 设计需要平衡那些我们都会跳跃的创意

在这个空间很显然&#xff0c;洞石是作为设计师的首选&#xff0c;在电视墙、壁炉、都用了温润柔和的洞石铺设而成。设计这个门洞也是请了设计师最喜爱的工匠合作&#xff0c;他们知道如何配合设计师&#xff0c;精准的执行&#xff0c;对细节有着极致的标准。

如何解决openal32.dll丢失,有什么办法解决

你第一次知道openal32.dll文件是在什么情况下&#xff0c;你了解过openal32.dll文件吗&#xff1f;如果电脑中openal32.dll丢失有什么办法可以解决&#xff0c;今天就教大家如何解决openal32.dll丢失&#xff0c;都有哪些办法可以解决openal32.dll丢失。 一&#xff0e;openal3…

解决: 使用html2canvas和print-js打印组件时, 超出高度出现空白页

如果所示&#xff1a;当我利用html2canvas转换成图片后, 然后使用print-js打印多张图片, 第一张会出现空白页 打印组件可参考这个: Vue-使用html2canvas和print-js打印组件 解决: 因为是使用html2canvas转换成图片后才打印的, 而图片是行内块级元素, 会有间隙, 所以被挤下去了…

基于YOLOv5的火灾烟雾检测系统

目录 1&#xff0c;YOLOv5算法原理介绍 2&#xff0c;代码实现 3&#xff0c;结果展示 1&#xff0c;YOLOv5算法原理介绍 YOLOv5是目前应用广泛的目标检测算法之一&#xff0c;其主要结构分为两个部分&#xff1a;骨干网络和检测头。 骨干网络采用的是CSPDarknet53&#xff…

机器学习必修课 - 交叉验证 Cross-Validation

想象一下你有一个包含5000行数据的数据集。通常情况下&#xff0c;你会将约20%的数据保留作为验证数据集&#xff0c;即1000行。但这会在确定模型得分时引入一些随机性。也就是说&#xff0c;一个模型可能在一组1000行数据上表现良好&#xff0c;即使在另一组1000行数据上表现不…

信息收集-01-WEB应用

针对各种应用的信息收集&#xff08;Web网站、APP应用、PC应用、小程序应用、微信公众号等&#xff09; 常见查询网址和平台 1.业务资产 企业资产分五类&#xff1a;Web应用、APP应用、PC端应用、小程序应用、微信公众号、其他产品 信息收集目标&#xff1a;某某企业、某某…

C语言打印菱形

一、运行结果图 二、源代码 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int line 0;int i 0;int j 0;//获取变量值&#xff1b;scanf("%d", &line);//循环打印上半部分&#xff1b;for (i 0; i <…

解决nginx反向代理web service的soap:address location问题

原webservice是部署在tomcat上&#xff0c;使用的http协议端口是80&#xff0c;基于安全原因&#xff0c;需要升级使用https&#xff0c;使用了简单的方式在最外层加nginx做反向代理&#xff0c;业务调用webservice接口通过nginx再去访问。nginx需要开启SSL配置证书。 现在发现…

深度学习纯小白如何从零开始写第一篇论文?看完这篇豁然开朗!

&#x1f4e2;前言 上个月小贾消失了一段时间&#xff0c;原因就是。。。 写论文去啦&#xff01;&#xff01;&#xff01; 先拿我导的认可镇个楼&#xff1a; 本篇文章将分享我个人从迷茫地找方向→苦苦做了48次实验才高效涨点→写论文到头秃等等一系列真实经历&#xff0c…

2023年中国地面安全门产业链、市场规模及行业需求前景分析[图]

地面安全门是一种用于地下停车场或车库入口的特殊门类&#xff0c;通常是钢质或铝质制成&#xff0c;可以在地面上开启和关闭&#xff0c;使车辆能够进出停车场。地面安全门通常配备电动驱动系统和遥控器&#xff0c;方便用户远程控制门的开启和关闭。 地面安全门行业分类 资料…

网表导入virtuoso后发现pg pin忘记connect_pg_net/globalNetConnect怎么办?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 数模混合项目中经常需要一些需要到virtuoso去连接的线,比如IO上的pg和一些信号线,除了在pr工作中设置skip route之外还需要做好net的赋值,告诉工具虽然我没在物理上有连接,但是实际上应该连什么…

数据库中删除部分记录,导致的自增 ID 的不连续问题

问题如图所示&#xff1a; 删除了部分数据后&#xff0c;自增 ID 从 21 处开始断层&#xff0c;从而出现了自增 ID 不连续的问题 解决方法&#xff1a; 设置变量i 0 把表中的id字段都重新修改一遍&#xff0c;从1开始 设置自增值为1&#xff0c;防止下次插入数…

Windows安装人大金仓数据库问题解决

一、安装包、授权文件下载 官网下载windows对应的安装包 下载授权文件 二、安装 &#xff08;1&#xff09;将下载的授权文件包解压待用 &#xff08;2&#xff09;将下载好的.iso安装程序解压&#xff0c;使用管理员身份运行安装程序&#xff0c;一路下一步&#xff0c;直…