五、流程控制语句

本文介绍了Java中的条件执行,如if...else和switch-case语句,以及循环结构,包括while、do/while、for和foreach的使用方法。同时讲解了如何通过break和continue控制循环流程。
摘要由CSDN通过智能技术生成

流程控制语句

本文为书籍《Java编程的逻辑》1和《剑指Java:核心原理与应用实践》2阅读笔记

1.1 条件执行

一些操作只能在某些条件满足的情况下才执行,在一些条件下执行某种操作,在另外一些条件下执行另外的操作。java中使用if...else...语句可以实现条件语句。

if(条件1){
    代码块1
}else if(条件2){
    代码块2
}else if(条件n){
    代码块n
}else{
    代码块n+1
}

使用if...else...求解一元二次方程解:

package com.ieening;

import java.util.Scanner;

public class QuadraticEquationWithOneUnknownTest {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入参数 a 的值:");
        int a = input.nextInt();
        System.out.print("请输入参数 b 的值:");
        int b = input.nextInt();
        System.out.print("请输入参数 c 的值:");
        int c = input.nextInt();
        input.close();
        if (a != 0) {
            double d = b * b - 4 * a * c;
            if (d > 0) {
                double x1 = (-b + Math.sqrt(d)) / (2 * a);
                double x2 = (-b - Math.sqrt(d)) / (2 * a);
                System.out.println("一元二次方程 " + a + "*x^2+" + b + "x+" + c + "=0" + "有两个实数解: x1=" + x1 + ", x2=" + x2);
            } else if (d == 0) {
                int x = -b / (2 * a);
                System.out.println("一元二次方程 " + a + "*x^2+" + b + "x+" + c + "=0" + "有两个相同的实数解: x1=x2=" + x);
            } else {
                // d<0
                System.out.println("一元二次方程在实数范围内无解");
            }
        } else { // 即: a==0
            if (b != 0) {
                double x = -c / b;
                System.out.println("一元一次方程的解: x=" + x);
            } else {
                System.out.println("输入有误,a=" + a + ",b=" + b + ",c=" + c + " 不能构成一个方程");
            }
        }
    }
}

除了if...else...语句,java中还提供switch-case提供多分支程序结构语句。

switch(变量或表达式){
    case 常量 1:
        语句1;
        break;
    case 常量 2:
        语句2;
        break;
        ......
    case 常量N:
        语句 N;
        break;
    default:
        语句;
        break;
}

switch结构的执行过程是先获取变量或表达式的值,然后从上往下依次匹配各个case后的常量值,判断是否与之相等。如果匹配成功,则执行case后的语句,直到遇见breakswitch执行结束为止;如果匹配不成功,则执行default后的语句,直到遇见breakswitch执行结束为止。

在使用switch结构时,还要注意以下几个事项。

  1. switch中的变量或表达式的类型在JDK 5前只能是int类型,或者int类型的兼容类型byteshortchar,在JDK 5后开始支持枚举类型,在JDK 7后开始支持String类型。
  2. case后只能是常量值,不能是变量或表达式。
  3. case后的常量值不能重复。
  4. case语句块中如果没有break,则将贯穿执行下面的casedefault中的语句,不再判断是否相等。

1.2 循环

循环结构是指在某些条件满足的情况下,反复执行某段代码的结构。循环结构由循环条件来判断继续执行某个功能还是退出循环。在实际生活中,也有很多类似的循环结构,如播放歌曲的单曲循环等。

Java中,循环有 4 4 4​种形式,分别是whiledo/whileforforeach

1、while

while的语法为:

while(条件语句){
    代码块;
}

while(条件语句) 代码;

while中条件语句为真,就会一直执行。

2、do/while

如果不管条件语句是什么,代码块都会至少执行一次,则可以使用do/while循环,其语法为:

do{
    代码块;
}while(条件语句)

先执行代码块,然后再判断条件语句,如果成立,则继续循环,否则退出循环。

3、for

for(初始化语句;循环条件;步进操作){
    循环体;
}

for后面的括号中有两个分号;,分隔了三条语句。除了循环条件必须返回一个boolean类型外,其他语句没有什么要求,但通常情况下第一条语句用于初始化,尤其是循环的索引变量,第三条语句修改循环变量,一般是步进,即递增或递减索引变量,循环体是在循环中执行的语句。for循环简化了书写,但执行过程对初学者而言不是那么明显,实际上,它执行的流程如下:

  1. 执行初始化指令;
  2. 检查循环条件是否为true,如果为false,则跳转到第 6 6 6步;
  3. 循环条件为真,执行循环体;
  4. 执行步进操作;
  5. 步进操作执行完后,跳转到第 2 2 2步,即继续检查循环条件;
  6. for循环后面的语句。

4、foreach

foreach的语法如下所示:

int[] arr = {1,2,3,4};
for(int element : arr){
    System.out.println(element);
}

foreach不是一个关键字,它使用冒号:,冒号前面是循环中的每个元素,包括数据类型和变量名称,冒号后面是要遍历的数组或集合,每次循环element都会自动更新。对于不需要使用索引变量,只是简单遍历的情况,foreach语法上更为简洁。

1.3 循环控制

在循环的时候,会以循环条件作为是否结束的依据,但有时可能会需要根据别的条件提前结束循环或跳过一些代码,这时可以使用breakcontinue关键字对循环进行控制。

1、break

break用于提前结束循环。比如,在一个数组中查找某个元素的时候,循环条件可能是到数组结束,但如果找到了元素,可能就会想提前结束循环,这时就可以使用break。我们在学习switch的时候提到过break,它用于跳转到switch外面。在循环的循环体中也可以使用break,它的含义和switch中的类似,用于跳出循环,开始执行循环后面的语句。以在数组中查找元素作为例子,代码可能是:

int[] arr =; //在该数组中查找元素
int toSearch = 100; //要查找的元素
int i = 0;
for(; i<arr.length; i++){
    if(arr[i]==toSearch){
        break;
    }
}
if(i! =arr.length){
    System.out.println("found");
}else{
    System.out.println("not found");
}

如果找到了,会调用breakbreak执行后会跳转到循环外面,不会再执行i++语句,所以即使是最后一个元素匹配,i也小于arr.length,而如果没有找到,i最后会变为arr. length,所以可根据i是否等于arr.length来判断是否找到了。以上代码中,也可以将判断是否找到的检查放到循环条件中,但通常情况下,使用break会使代码更清楚一些。

2、continue

在循环的过程中,有的代码可能不需要每次循环都执行,这时候,可以使用continue语句,continue语句会跳过循环体中剩下的代码,然后执行步进操作。我们看个例子,以下代码统计一个数组中某个元素的个数:

int[] arr =//在该数组中查找元素
int toSearch = 2;  //要查找的元素
int count = 0;
for(int i=0; i<arr.length; i++){
    if(arr[i]! =toSearch){
        continue;
    }
    count++;
}
System.out.println("found count "+count);

上面的代码统计数组中值等于toSearch的元素个数,如果值不等于toSearch,则跳过剩下的循环代码,执行i++。以上代码也可以不用continue,使用相反的if判断也可以得到相同的结果。这只是个人偏好的问题,如果类似要跳过的情况比较多,使用continue可能会更易读。


  1. [1]马俊昌.Java编程的逻辑[M].北京:机械工业出版社,2018. ↩︎

  2. [2]尚硅谷教育.剑指Java:核心原理与应用实践[M].北京:电子工业出版社,2023. ↩︎

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值