程序通过流程控制语句决定运行时的走向,并完成特定的任务。在默认情况下,系统按照语句的先后顺序依次执行,这就是所谓的顺序结构。顺序结构学习起来虽然简单,但在处理复杂问题时往往捉襟见肘。为此,在计算机编程语言中又出现了分支结构、循环结构和跳转结构。
本节主要对分支结构、循环结构和跳转结构中涉及的流程控制语句进行介绍。
分支语句提供一种机制,使得程序可以根据表达式结果或者变量状态选择不同的执行路径。它解决了顺序结构不能判断的缺点。
Java提供两种选择语句:if语句和switch语句。它们也被称为条件语句或选择语句。
if语句的语法格式如下。
if (条件表达式){
语句块;
}
上述语法格式表达的意思是,如果if关键字后面的表达式成立,那么程序就执行语句块,其执行流程如图2-8所示。
图2-8 if语句执行流程图
当if后面的条件表达式为true时,则执行紧跟其后的语句块;如果条件表达式为false,则执行程序中if语句后面的其他语句。语句块中如果只有一个语句,可以不用{}括起来,但为了增强程序的可读性最好不要省略。
【例2-15】通过键盘输入两个整数,输出其中较大的一个。
import java.util.Scanner; //导入Scanner类
public class MaxNum {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); //构造Scanner对象
int num1,num2,max;
System.out.println("请输入两个整数:");
num1 = input.nextInt(); //从键盘输入一个整数
num2 = input.nextInt();
max = num1;
if(num2 > max) {
max = num2;
}
System.out.println(num1+"和"+num2+"的最大值是:"+max);
}
}
程序执行结果如图2-9所示。
图2-9 例2-15的运行结果
if语句后面可以跟else语句,if-else语句的语法格式如下。
if (条件表达式){
语句块1;
}else{
语句块2;
}
上述语法表达的意思是,如果if关键字后面的表达式成立,那么程序就执行语句块1,否则执行语句块2。其执行流程如图2-10所示。
图2-10 if-else语句执行流程图
【例2-16】if-else应用举例。
功能实现: 通过键盘输入一个整数,判断该整数是否大于或等于18,如果大于或等于18输出“成年人”,否则输出“未成年人”。
程序执行结果如图2-11所示。
图2-11 例2-16的运行结果
if-else嵌套语句是功能强大的分支语句,可以解决几乎所有的分支问题。if-else嵌套语句的语法格式如下。
if (条件表达式1){
if (条件表达式2){
语句块1;
}else{
语句块2;
}
}else{
if (条件表达式3){
语句块3;
}else{
语句块4;
}
}
其执行流程如图2-12所示。
图2-12 if-else嵌套语句执行流程图
【例2-17】通过键盘输入两个整数,比较它们的大小。
功能实现: 通过嵌套的if-else语句判断两个整数的大小,并根据情况输出不同内容。
程序执行结果如图2-13所示。
图2-13 例2-17的运行结果
Java语言中除了嵌套的if语句可以实现多分支结构外,switch语句也可以实现多分支结构,也称为开关语句。
switch语句是多分支的开关语句。它的一般格式定义如下(其中break语句是可选的)。
switch(表达式){
case 值1:
语句块1;
break;
case 值2:
语句块2;
break;
…
case 值n:
语句块n;
break;
default:
语句块n+1;
}
其中,switch、case、break是Java的关键字。switch语句的功能是判断表达式的值与一系列值中某个值是否相等,每个值称为一个分支。
switch语句有如下几个规则。
· switch后面括号中表达式的值可以是byte、short、int或者char。从Java 7开始,表达式的值也可以是字符串String类型。
· switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。
· case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量。
· 当变量的值与case语句的值相等时,case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。
· 当遇到break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不一定要包含break语句。如果没有break语句出现,程序会继续执行下一条case语句,直到出现break语句。
· switch语句可以包含一个default分支,该分支一般是switch语句的最后一个分支(可以在任何位置,但建议在最后一个)。default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。
【例2-18】利用switch语句处理表达式中的运算符,并输出运算结果。
程序执行结果如图2-14所示。
图2-14 例2-18的运行结果
如果case语句块中没有break语句,匹配成功后,从当前case开始,后续所有case的值都会输出。
【例2-19】case后面不带break的例子。
程序运行结果如图2-15所示。
图2-15 例2-19的运行结果
循环语句的作用是反复执行一段代码,直到满足特定条件为止。Java语言中提供的循环语句主要有三种,分别是while语句、do-while语句、for语句。在Java 5中引入了一种主要用于数组的增强型for循环,具体用法在介绍数组时讲解。
while语句的语法格式如下。
while(条件表达式){
语句块;
}
执行while循环时,首先判断“条件表达式”的值,如果为true,则执行语句块。每执行一次语句块,都会重新计算条件表达式的值。如果为true,则继续执行语句块,直到条件表达式的值为false时结束循环。
while语句执行流程如图2-16所示。
图2-16 while语句执行流程图
【例2-20】利用while语句求10个整数的和,并输出运算结果。
程序执行结果如图2-17所示。
图2-17 例2-20的运行结果
do-while语句的格式如下。
do{
语句块;
}while(条件表达式);
do-while循环与while循环的不同在于:它先执行语句块,然后再判断条件表达式的值。如果为true则继续执行语句块,直到条件表达式的值为false为止。因此,do-while语句至少要执行一次语句块。
do-while语句的执行流程如图2-18所示。
图2-18 do-while语句执行流程图
【例2-21】利用do-while语句输出整数n的位数。
程序执行结果如图2-19所示。
图2-19 例2-21的运行结果
for语句是一种功能最强、使用最广泛的循环语句。for语句的循环次数是在执行前就确定的。for语句的语法格式如下:
for(表达式1;表达式2;表达式3){
语句块;
}
for语句中3个表达式之间用“;”分开,他们的具体含义如下。
表达式1:初始化表达式,通常用于给循环变量赋初值。
表达式2:条件表达式。它是一个布尔表达式,只有值为true时才会继续执行for语句中的语句块。
表达式3:更新表达式,用于改变循环变量的值,避免死循环。
for语句的执行流程如图2-20所示。
①循环开始时,首先计算表达式1,完成循环变量的初始化工作。
②计算表达式2的值,如表达式2的值为true,则执行语句块,否则不执行语句块,跳出循环语句。
③执行完一次循环后,计算表达式3,改变循环变量的状态。
④转入②继续执行。
图2-20 for语句执行流程图
【例2-22】利用for语句求n个整数的最大值。
程序执行结果如图2-21所示。
图2-21 例2-22的运行结果
所谓循环语句嵌套就是循环语句的循环体中包含另外一个循环语句。Java语言支持循环语句嵌套,如for循环语句嵌套,while循环语句嵌套,也支持二者的混合嵌套。
【例2-23】利用for循环语句嵌套打印九九乘法表。
程序执行结果如图2-22所示。
图2-22 例2-23的运行结果
跳转语句用来实现循环语句中的执行流程转移。在前面学习switch语句时,用到的break语句就是一种跳转语句。在Java语言中,经常使用的跳转语句主要包括break语句和continue语句。
在Java语言中,break用于强行跳出循环体,不再执行循环体中break后面的语句。如果break语句出现在嵌套循环中的内层循环,则break的作用是跳出内层循环,即break每次只能跳出一层循环。
【例2-24】break语句应用举例。
功能实现: 利用for循环语句计算1到100之间的整数之和,当和大于500时,使用break跳出循环,并打印此时的求和结果。
程序执行结果如图2-23所示。
图2-23 例2-24的运行结果
从程序执行结果可以发现,当sum大于500时,程序执行break语句跳出循环体,不再继续执行求和运算。此时sum的值为528,而不是1~100的所有数之和5050。
continue语句只能用在循环语句中,否则将会出现编译错误。当程序在循环语句中执行到continue语句时,自动结束本轮次循环体的执行,回到循环的开始处重新判断循环条件,决定是否继续执行循环体。
【例2-25】输出1~10的所有不能被3整除的自然数。
程序执行结果如图2-24所示。
从程序执行结果可以发现,1~10能被3整除的自然数在结果中均没有出现。这是因为当程序遇到能被3整除的自然数时,满足了if语句的判断条件,因执行continue语句,不再执行continue语句后面的输出语句,开始了新一轮次的循环,所以能被3整除的数没有出现在结果中。
图2-24 例2-25运行结果