流程控制语句
本文为书籍《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
后的语句,直到遇见break
或switch
执行结束为止;如果匹配不成功,则执行default
后的语句,直到遇见break
或switch
执行结束为止。
在使用switch
结构时,还要注意以下几个事项。
switch
中的变量或表达式的类型在JDK 5
前只能是int
类型,或者int
类型的兼容类型byte
、short
、char
,在JDK 5
后开始支持枚举类型,在JDK 7
后开始支持String
类型。case
后只能是常量值,不能是变量或表达式。case
后的常量值不能重复。case
语句块中如果没有break
,则将贯穿执行下面的case
或default
中的语句,不再判断是否相等。
1.2 循环
循环结构是指在某些条件满足的情况下,反复执行某段代码的结构。循环结构由循环条件来判断继续执行某个功能还是退出循环。在实际生活中,也有很多类似的循环结构,如播放歌曲的单曲循环等。
在Java
中,循环有
4
4
4种形式,分别是while
、do/while
、for
和foreach
。
1、while
while
的语法为:
while(条件语句){
代码块;
}
或
while(条件语句) 代码;
当while
中条件语句为真,就会一直执行。
2、do/while
如果不管条件语句是什么,代码块都会至少执行一次,则可以使用do/while
循环,其语法为:
do{
代码块;
}while(条件语句)
先执行代码块,然后再判断条件语句,如果成立,则继续循环,否则退出循环。
3、for
for(初始化语句;循环条件;步进操作){
循环体;
}
for
后面的括号中有两个分号;
,分隔了三条语句。除了循环条件必须返回一个boolean
类型外,其他语句没有什么要求,但通常情况下第一条语句用于初始化,尤其是循环的索引变量,第三条语句修改循环变量,一般是步进,即递增或递减索引变量,循环体是在循环中执行的语句。for
循环简化了书写,但执行过程对初学者而言不是那么明显,实际上,它执行的流程如下:
- 执行初始化指令;
- 检查循环条件是否为
true
,如果为false
,则跳转到第 6 6 6步; - 循环条件为真,执行循环体;
- 执行步进操作;
- 步进操作执行完后,跳转到第 2 2 2步,即继续检查循环条件;
- for循环后面的语句。
4、foreach
foreach
的语法如下所示:
int[] arr = {1,2,3,4};
for(int element : arr){
System.out.println(element);
}
foreach
不是一个关键字,它使用冒号:
,冒号前面是循环中的每个元素,包括数据类型和变量名称,冒号后面是要遍历的数组或集合,每次循环element
都会自动更新。对于不需要使用索引变量,只是简单遍历的情况,foreach语法上更为简洁。
1.3 循环控制
在循环的时候,会以循环条件作为是否结束的依据,但有时可能会需要根据别的条件提前结束循环或跳过一些代码,这时可以使用break
或continue
关键字对循环进行控制。
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");
}
如果找到了,会调用break
,break
执行后会跳转到循环外面,不会再执行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
可能会更易读。