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

【Java 专题补充】流程控制语句

        流程控制语句是用来控制程序中各语句执行顺序的语句,是程序中既基本又非常关键的部分。流程控制语句可以把单个的语句组合成有意义的、能完成一定功能的小逻辑模块。最主要的流程控制方式是结构化程序设计中规定的三种基本流程结构。

1.1 结构化程序设计的三种基本流程

        任何程序都可以且只能由三种基本流程结构构成,即顺序结构、分支结构和循环结构。
        顺序结构是三种结构中最简单的一种,即语句按照书写的顺序依次执行。分支结构又称为选择结构,它根据计算所得的表达式的值来判断应选择执行哪一个流程的分支。循环结构则是在一定条件下反复执行一段语句的流程结构。这三种结构构成了程序局部模块的基本框架,如图 3-2 所示。

        Java语言虽然是面向对象的语言,但是在局部的语句块内部,仍然需要借助于结构化程序设计的基本流程结构来组织语句,完成相应的逻辑功能。Java的语句块是由一对大括号括起的若干语句的集合。Java中,有专门负责实现分支结构的条件分支语句和负责实现循环结构的循环语句。

1.2 简单语句

        最简单的流程是顺序结构,在Java中一句一句地书写。而最简单的语句是方法调用语句及赋值语句,是在方法调用或赋值表达式后加一个分号(;),分别表示完成相关的任务及赋值。如: 

System.out.println("Hello World");
a = 3 + x;
b = a > 0 ? a : -a;
s = TextBoxl.getText();
d = Integer.parseInt(s);

1.3 分支语句 

1. if语句

        if语句的一般形式是

if(条件表达式)
        语句块;        //分支
else
        语句块;        //else 分支

        其中,语句块是一条语句(带分号)或者是用一对花括号括起来的多条语句;条件表达式用来选择判断程序的流程走向,在程序的实际执行过程中,如果条件表达式的取值为真,则执行i分支的语句块,否则执行else分支的语句块。在编写程序时,也可以不书写else 分支。此时,若条件表达式的取值为假,则绕过分支直接执行if语句后面的其他语句。语法格式如下:

if(条件表达式)
        语句块;

        下面是一个i语句的简单例子,实现求某数的绝对值,
                if(a>=0)b=a;else b =-a;

        具体的例子,即LeapYear.java 判断闰年:【日撸 Java 三百行】Day 4(条件语句实战——闰年问题)-CSDN博客

2. swtich 语句

switch语句是多分支的开关语句,一般形式是:

switch(表达式) {
        case判断值1:一系列语句1:break:
        case判断值2:一系列语句2:break;

        ...
        case 判断值n:一系列语句n;break;
        default:一系列语句 n+1

}

注意:

        其中,表达式必须是整数型或字符类型,从Java6开始,表达式可以是字符串(String)类型或者枚举类型。判断值必须是常数,而不能是变量或表达式。

        switch语句在执行时,首先计算表达式的值,这个值必须是整型、字符型、字符串或枚举类型,同时应与各个case分支的判断值的类型相一致。计算出表达式的值之后,将它先与第一个case 分支的判断值相比较,若相同,则程序的流程转入第一个case 分支的语句块;否则,再将表达式的值与第二个case分支相比较,……依次类推。如果表达式的值与任何一个 case 分支都不相同,则转而执行最后的 default 分支;在 default 分支不存在的情况下则跳出整个 switch 语句。

注意:

        switch语句的每一个 case 判断,在一般情况下都有 break 语句,以指明这个分支执行完成后,就跳出该switch语句。在某些特定的场合下可能不需要 break 语句,如在若干判断值共享同一个分支时,就可以实现由不同的判断语句流入相同的分支。

         具体的例子,即 scoreToLevel.java 根据考试成绩判断对应等级:【日撸 Java 三百行】Day 5(Switch语句)-CSDN博客

1.4 循环语句

        循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环结构是程序中非常重要和基本的一种结构,它是由循环语句来实现的。Java的循环语句共有三种:for、while和do…while 语句,如图3-4 所示。
        三种语句在使用时,都要表达以下几个要素。

  1. 循环的初始化。
  2. 循环的条件。
  3. 循环体。
  4. 循环的改变

        下面的例题是用三种方式来表达的1+2+3+…+100的循环相加的过程。

        例:Sum100.java 循环语句用于求 1=2+3+...+100

publie class Sum100 {public static void main(String args[]) {int sum, n;System.out.println("\n**** for statement ****");sum = 0:for(int i = 1; i <= 100; i++) {    //初始化,循环条件,循环改变sum += i; //循环体}System.out.println("sum is "+ sum);System.out.println("\n**** while statement ****");sum = 0;n = 100;          //初始化while(n > 0) {    //循环条件sum += n;     //循环体n--;          //循环改变}System.out.println("sum is " + sum);System.out.println("\n**** do_while statement ****");sum = 0;n = 1;             //初始化do {sum += n;      //循环体n++;           //循环改变} while( n<= 100); //循环条件System.out.println("sum is "+ sum);}
}

        运行结果如下:
        

        可以从中比较这三种循环语句,从而在不同的场合选择合适的语句。
        下面比较详细地讲解这三种循环语句的用法。

1. for 语句

        for语句是Java语言三个循环语句中功能较强、使用较广泛的一个,它的流程结构可参看图3-4(a)。for语句的一般语法格式如下:

for(表达式1;表达式2;表达式 3)
        循环体

        其中,表达式1完成初始化循环变量和其他变量的工作:表达式2是返回布尔值的条件表达式,用来判断循环是否继续;表达式3用来修改循环变量,改变循环条件。3个表达式之间用分号隔开。
        for语句的执行过程是首先计算表达式1,完成必要的初始化工作;再判断表达式2的值,若为真,则执行循环体,执行完循环体后再返回表达式3,计算并修改循环条件。这样一轮循环就结束了。第二轮循环从计算并判断表达式2开始,若表达式的值仍为真,则继续循环:否则,跳出整个for语句执行下面的句子。for语句的三个表达式都可以为空,但若表达式2也为空,则表示当前循环是一个无限循环,需要在循环体中书写另外的跳转语句终止循环。
注意:

        for 循环的第1个表达式中,可以定义变量,这里定义的变量只在该循环体内有效。如for(int n = 0; n < 100; n++) {System.out.println(n); }

2. while 语句

        while语句的一般语法格式如下:

while(条件表达式)
        循环体

        其中,条件表达式的返回值为布尔型,循环体可以是单个语句,也可以是复合语句块。
        while语句的执行过程是先判断条件表达式的值,若为真,则执行循环体,循环体执行完之后再无条件转向条件表达式做计算与判断:当计算出条件表达式为假时,跳过循环体执行 while 语句后面的语句。 

3. do...while句

        do...while语句的一般语法结构如下:

do
        循环体
while(条件表达式);

        do...while语句的使用与while语句很类似,不同的是,它不像while语句是先计算条件表达式的值,而是无条件地先执行一遍循环体,再来判断条件表达式。若表达式的值为真则运行循环体,否则跳出 do...while循环,执行下面的语句。可以看出,do...while 语句的特点是它的循环体将至少被执行一次。

4. 加强的 for 语句

        另外在Java5 引入了一种主要用于数组的增强型 for 循环。
        格式如下:

for(声明语句 : 表达式)
{//代码句子
}

        这种增强就如同当年C++的C++11扩充一样,无论是使用方法上还是效果上都是类似的。
        声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配(即与表达式中的数据结构集合中的每个子项的类型匹配)。其作用域限定在循环语句块,其值与此时数组元素的值相等。
        表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
        口说无凭,计算机人还是要以“show me the code !”才行

public class Test {public static void main(String[] args) {int[] numbers = { 10, 20, 30, 40, 50 }; // Create a int arrayfor (int x : numbers) { // Get the elements in the array in orderSystem.out.print(x);System.out.print(",");}System.out.print("\n");String[] names = { "James", "Larry", "Tom", "Lacy" }; // Create a string arrayfor (String name : names) {System.out.print(name);System.out.print(",");}}
}

        另外通过实际测试,发现了java5的这种增强for与C++11的增强for一个相同点与差异点:

        1.相同:for(val : array)的遍历之下的每个val值是仅仅可读的,但是不可写,val只能用来获取而无法通过修改val来修改array对于中的数据。用计算机的话来说,读取的val不是这个array中那个对应数的地址,因此修改val无法改动到array。这个C++与java一致。

        2.不同:C++可以利用关键符“&”,用for(&val : array)的形式直接读取array对于元素的地址,这样可以直接修改array中对应的值,而这点java目前我还没有查到可以做到的方法(若有欢迎指正!)

        可见相比于一般的for循环,这个方法能更快实现我们的遍历任务,避免我们对于一个未知长度的数组还要进行获取长度并再用循环因子进行索引遍历的麻烦。 但是也得辩证看待这个问题,对于某些需要用遍历因子完成的算法,基本的for又会简单一些,所以不要图简单就一味使用,要针对具体问题具体分析。

1.5 跳转语句

        跳转语句用来实现程序执行过程中流程的转移。前面,在switch语句中使用过的break语句就是一种跳转语句。为了提高程序的可靠性和可读性,Java语言不支持无条件跳转的goto语句。Java的跳转语句有三个:continue、break和return语。

1. continue 语句

        continue 语句必须用于循环结构中,它有两种使用形式。
        一种是不代标号的continue语句,它的作用是终止当前这一轮的循环,跳过本轮剩余的语句,直接进入当前循环的下一轮。在 while或 do...while循环中,不带标号的 continue 语句会使流程直接跳转至条件表达式。在for循环中,不带标号的continue语句会跳转至表达式3.计算修改循环变量后再判断循环条件。
        另一种是带标号的continue语句,其格式是:

continue标号名;

        这个标号名应该定义在程序中外层循环语句的前面,用来标志这个循环结构。标号的命名应该符合Java标识符的规定。带标号的continue语句使程序的流程直接转入标号标明的循环层次。

2. break语句

        break语句的作用是使程序的流程从一个语句块内部跳转出来,如从switch语句的分支中跳出,或从循环体内部跳出。break语句同样分为带标号和不带标号两种形式。带标号的break语句的使用格式是:

break标号名;

        这个标号应该标志某一个语句块。执行break语句就从这个语句块中跳出来,流程进入该语句块后面的语句。
        不带标号的 break语句从它所在的 switch 分支或最内层的循环体中跳转出来,执行分支或循环体后面的语句。

        例:MaxDiv.java 求一个数的最大真约数。程序中从大向小进行循环,直到能整除,则用 break 退出循环。

public class MaxDiv {public static void main(String[] args) {int a = 99;int i = a-1;while(i>0) {if(a % i == 0)break;i--;}System.out.println(a + "的最大真约数为:" + i);}
}

        运行结果如下:
 

3. return 语句

        return 语句的一般格式是:

return表达式:

        return 语句用来使程序流程从方法调用中返回,表达式的值就是调用方法的返回值。如果方法没有返回值,则retum语句不用表达式。

        例:Prime100Continue.java求100~200 间的所有质数。
 

public class Prime100Continue {public static void main(String args[]) {System.out.println("**** 00--200的质数 ****");int n = 0;outer: for(int i = 101; i <= 200; i += 2) {    //外层循环for(int j = 2; j < i; j++)                 //内层循环if(i % j == 0)                         //不是质数,则继续外层循环continue outer;}System.out.print(" " +i);                  //显示质数n++;                                       //计算个数if(n < 10)                                 //未满10个数,则不换行continue;System.out.println( );n = 0;}System.out.println( );}
}

        该例通过一个嵌套的for语句来实现。其中,外层循环遍历101~200,内层循环针对一个数i,用2到i-1之间的数去除,若能除尽,则表明不是质数,直接继续外层的下一次循环(continue outer)。这里 outer 是语句的“标签”,表明是哪个循环,可以改成其他任意标识符,只要与continue后用的标识符一致即可。程序运行结果如下:

相关文章:

【Java 专题补充】流程控制语句

流程控制语句是用来控制程序中各语句执行顺序的语句&#xff0c;是程序中既基本又非常关键的部分。流程控制语句可以把单个的语句组合成有意义的、能完成一定功能的小逻辑模块。最主要的流程控制方式是结构化程序设计中规定的三种基本流程结构。 1.1 结构化程序设计的三种基本流…...

恶心的win11更新DIY 设置win11更新为100年

‌打开注册表编辑器‌&#xff1a;按下Win R键&#xff0c;输入regedit&#xff0c;然后按回车打开注册表编辑器。‌12‌导航到指定路径‌&#xff1a;在注册表编辑器中&#xff0c;依次展开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings‌新建DWORD值‌&…...

【ArcGIS微课1000例】0146:将多个文件夹下的影像移动到一个目标文件夹(以Landscan数据为例)

本文讲述将多个文件夹下的影像移动到一个目标文件夹,便于投影变换、裁剪等操作。 文章目录 一、数据准备二、解压操作三、批量移动四、查看效果五、ArcGIS操作一、数据准备 全球人口数据集Landscan2000-2023如下所示,每年数据位一个压缩包: 二、解压操作 首先将其解压,方…...

【redis】分片方案

Redis分片&#xff08;Sharding&#xff09;是解决单机性能瓶颈的核心技术&#xff0c;其本质是将数据分散存储到多个Redis节点&#xff08;实例&#xff09;中&#xff0c;每个实例将只是所有键的一个子集&#xff0c;通过水平扩展提升系统容量和性能。 分片的核心价值 性能提…...

springboot+mysql+element-plus+vue完整实现汽车租赁系统

目录 一、项目介绍 二、项目截图 1.项目结构图 三、系统详细介绍 管理后台 1.登陆页 2.管理后台主页 3.汽车地点管理 4.汽车类别 5.汽车品牌 6.汽车信息 7.用户管理 8.举报管理 9.订单管理 10.轮播图管理 11.交互界面 12.图表管理 汽车租赁商城 1.首页 2.汽…...

Linux第四节:进程控制

一、进程创建 1.1 fork函数 1. fork函数有两个返回值问题 返回的本质就是写入&#xff01;所以&#xff0c;谁先返回&#xff0c;谁就先写入id&#xff0c;因为进程具有独立性&#xff0c;会发生写时拷贝&#xff0c;父进程和子进程各自指向return语句。 2. fork返回后&#x…...

Qt 编译 sqldrivers之psql

编译postgres pgsql驱动 下载驱动源码修改配置文件编译 下载驱动源码 // 源代码下载 https://download.qt.io/archive/qt/5.15/5.15.2/submodules/驱动目录:qtbase-everywhere-src-5.15.2\src\plugins\sqldrivers 修改配置文件 打开pro文件 右键点击添加库 此处的为debu…...

382_C++_在用户会话结束时,检查是否有其他会话仍然来自同一个客户端 IP 地址,没有连接状态设置为断开,否则为连接

之前出现的问题:重启管理机,工作机上面热备连接状态显示未连接 (此时是有一个工作机连接管理机的),所以正常应该是连接状态解决:根因分析: 重启管理机后,管理机给过来的cookie是空的,导致工作机同时存在两个管理机的session,在其中一个超时后,调用回调函数通知会话断开…...

RViz(机器人可视化工具)的配置文件(moveitcpp)

1. Panels&#xff08;面板设置&#xff09; 面板是RViz界面中的各个功能区域&#xff0c;用于显示和操作不同的数据。 Displays&#xff08;显示面板&#xff09; Class: rviz_common/Displays 指定面板的类型&#xff0c;这里是显示面板。 Help Height: 78 帮助区域的高度…...

Redis中6种缓存更新策略

Redis作为一款高性能的内存数据库&#xff0c;已经成为缓存层的首选解决方案。然而&#xff0c;使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性。缓存更新策略直接影响系统的性能、可靠性和数据一致性&#xff0c;选择合适的策略至关重要。 本文将介绍Redis中6种缓…...

如何使用极狐GitLab 软件包仓库功能托管 terraform?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Terraform 模块库 (BASIC ALL) 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.1…...

观测云:安全、可信赖的监控观测云服务

引言 近日&#xff0c;“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案&#xff0c;再次引发行业内对数据合规等话题的热议。据了解&#xff0c;仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下&#xff0c;企业在数据隐私保护方面所面临…...

【python】使用Python和BERT进行文本摘要:从数据预处理到模型训练与生成

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息爆炸时代的到来,海量文本数据的高效处理与理解成为亟待解决的问题。文本摘要作为自然语言处理(NLP)中的关键任务,旨在自动生成…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 5.3 相关性分析&#xff08;PEARSON/SPEARMAN相关系数&#xff09;5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数&#xff08; Pearson Corr…...

Redis面试 实战贴 后面持续更新链接

redis是使用C语言写的。 面试问题列表&#xff1a; Redis支持哪些数据类型&#xff1f;各适用于什么场景&#xff1f; Redis为什么采用单线程模型&#xff1f;优势与瓶颈是什么&#xff1f; RDB和AOF持久化的区别&#xff1f;如何选择&#xff1f;混合持久化如何实现&#x…...

小程序滚动条隐藏(uniapp版本)

单独指定页面隐藏&#xff08;找到对应的scroll-view&#xff09; <style> /* 全局隐藏滚动条样式 */ ::-webkit-scrollbar { display: none; width: 0; height: 0; color: transparent; background: transparent; } /* 确保scroll-view组件也隐藏滚动条 */ …...

python基础:序列和索引-->Python的特殊属性

一.序列和索引 1.1 用索引检索字符串中的元素 # 正向递增 shelloworld for i in range (0,len(s)):# i是索引print(i,s[i],end\t\t) print(\n--------------------------) # 反向递减 for i in range (-10,0):print(i,s[i],end\t\t)print(\n--------------------------) print(…...

java反射(2)

package 反射;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays;public class demo {public static void main(String[] args) throws Exception {// 通过类的全限定名获取对应的 Class 对象…...

C++核心概念全解析:从析构函数到运算符重载的深度指南

目录 前言一、构析函数1.1 概念1.2 语法格式 1.3 核心特性1.4 调用时机1.5 构造函数 vs 析构函数1.6 代码示例 二、this关键字2.1 基本概念2.2 核心特性2.3 使用场景2.3.1 区分成员与局部变量2.3.2 返回对象自身&#xff08;链式调用&#xff09;2.3.3 成员函数间传递当前对象2…...

如何巧妙解决 Too many connections 报错?

1. 背景 在日常的 MySQL 运维中&#xff0c;难免会出现参数设置不合理&#xff0c;导致 MySQL 在使用过程中出现各种各样的问题。 今天&#xff0c;我们就来讲解一下 MySQL 运维中一种常见的问题&#xff1a;最大连接数设置不合理&#xff0c;一旦到了业务高峰期就会出现连接…...

自由学习记录(58)

Why you were able to complete the SpringBoot MyBatisPlus task smoothly: Clear logic flow: Database → Entity → Service → Controller → API → JSON response. Errors are explicit, results are verifiable — you know what’s broken and what’s fixed. Sta…...

ES6 知识点整理

一、变量声明&#xff1a;var、let、const 的区别 作用域 var&#xff1a;函数作用域&#xff08;函数内有效&#xff09;。let/const&#xff1a;块级作用域&#xff08;{} 内有效&#xff0c;如 if、for&#xff09;。 变量提升 var 会提升变量到作用域顶部&#xff08;值为…...

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营&#xff1a;从入门到工业级应用》高阶挑战篇-5G通信速成&#xff1a;MATLAB毫米波信道建模仿真指南 &#x1f680;&#x1f4e1; 大家好&#xff01;今天我将带大家进入5G通信的奇妙世界&#xff0c;我们一起探索5G通信中最激动人心的部分之一——毫米波信…...

工程师 - 汽车分类

欧洲和中国按字母对汽车分类&#xff1a; **轴距**&#xff1a;简单来说&#xff0c;就是前轮中心点到后轮中心点之间的距离&#xff0c;也就是前轮轴和后轮轴之间的长度。根据轴距的大小&#xff0c;国际上通常把轿车分为以下几类&#xff08;德国大众汽车习惯用A\B\C\D分类&a…...

57.[前端开发-前端工程化]Day04-webpack插件模式-搭建本地服务器

Webpack常见的插件和模式 1 认识插件Plugin 认识Plugin 2 CleanWebpackPlugin CleanWebpackPlugin 3 HtmlWebpackPlugin HtmlWebpackPlugin 生成index.html分析 自定义HTML模板 自定义模板数据填充 4 DefinePlugin DefinePlugin的介绍 DefinePlugin的使用 5 mode模式配置…...

K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析

一、金丝雀发布概述 1.1 什么是金丝雀发布&#xff1f; 金丝雀发布&#xff08;Canary Release&#xff09;是一种渐进式部署策略&#xff0c;通过逐步将生产流量从旧版本迁移至新版本&#xff0c;结合实时指标验证&#xff0c;在最小化风险的前提下完成版本迭代。其核心逻辑…...

Qt中数据结构使用自定义类————附带详细示例

文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较&#xff…...

数据可视化与分析

数据可视化的目的是为了数据分析&#xff0c;而非仅仅是数据的图形化展示。 项目介绍 项目案例为电商双11美妆数据分析&#xff0c;分析品牌销售量、性价比等。 数据集包括更新日期、ID、title、品牌名、克数容量、价格、销售数量、评论数量、店名等信息。 1、数据初步了解…...

基于大模型预测的产钳助产分娩全方位研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、产钳助产分娩概述 2.1 产钳助产定义与历史 2.2 适用情况与临床意义 三、大模型预测原理与数据基础 3.1 大模型技术原理 3.2 数据收集与处理 3.3 模型训练与验证 四、术前预测与准备 4.1 大模型术前风险预…...

通过混合机器学习和 TOPSIS 实现智能手机身份验证的稳健行为生物识别框架

1. 简介 随着日常工作、个人生活和金融操作对智能手机的依赖性不断增强,对弹性安全身份验证系统的需求也日益增长。尽管 PIN 码、密码和静态生物识别等传统身份验证方法仍可为系统提供一定的安全级别,但事实证明,它们容易受到多种威胁,包括敏感数据泄露、网络钓鱼、盗窃和…...