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

news2025/5/9 20:46:40

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

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 array

		for (int x : numbers) { // Get the elements in the array in order
			System.out.print(x);
			System.out.print(",");
		}
		System.out.print("\n");
		String[] names = { "James", "Larry", "Tom", "Lacy" }; // Create a string array
		for (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后用的标识符一致即可。程序运行结果如下:

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

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

相关文章

【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…

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

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

【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…

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 对象…

自由学习记录(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…

《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、数据初步了解…

旅游设备生产企业的痛点 质检系统在旅游设备生产企业的应用

在旅游设备制造行业&#xff0c;产品质量直接关系到用户体验与企业口碑。从景区缆车、观光车到水上娱乐设施&#xff0c;每一件设备的安全性与可靠性都需经过严苛检测。然而&#xff0c;传统质检模式常面临数据分散、流程不透明、合规风险高等痛点&#xff0c;难以满足旅游设备…

使用ESPHome烧录固件到ESP32-C3并接入HomeAssistant

文章目录 一、安装ESPHome二、配置ESP32-C3控制灯1.主配置文件esp32c3-luat.yaml2.基础通用配置base.yaml3.密码文件secret.yaml4.围栏灯four_light.yaml5.彩灯rgb_light.yaml6.左右柱灯left_right_light.yaml 三、安装固件四、HomeAssistant配置ESPHome1.直接访问2.配置ESPHom…

【漫话机器学习系列】237. TSS总平方和

深度理解 TSS&#xff08;总平方和&#xff09;&#xff1a;公式、意义与应用 在机器学习与统计建模领域&#xff0c;评价模型好坏的重要指标之一就是方差与误差分析。其中&#xff0c;TSS&#xff08;Total Sum of Squares&#xff0c;总平方和&#xff09;扮演着非常关键的角…

DeepSeek多尺度数据:无监督与原则性诊断方案全解析

DeepSeek 多尺度数据诊断方案的重要性 在当今的 IT 领域,数据如同石油,是驱动各类智能应用发展的核心资源。随着技术的飞速发展,数据的规模和复杂性呈爆炸式增长,多尺度数据处理成为了众多领域面临的关键挑战。以计算机视觉为例,在目标检测任务中,小目标可能只有几个像素…