
2.3 控制流语句
Java语言程序设计的源代码是由语句(Statement)构成的,由++和--操作符构成的单目表达式或赋值表达式后加上英文半角的分号(;)就形成了语句。Java语言的源程序就是有若干条语句组成的,每一条语句由英文半角的分号结束。语句可以是单行的一条语句,也可以是使用英文半角的花括号({})括起来的语句块或语句体。
2.3.1 顺序结构语句
从整体上来说,Java语言的源程序按照语句或语句体的书写顺序依次执行,这样的语句称为顺序结构语句,由此构成的程序称为顺序结构程序。
在编写解决复杂问题的程序时,局部的顺序结构语句往往不能满足程序设计的需求,但是可以通过流程控制的方式实现有效的组织代码运行顺序,这些改变顺序结构的语句称为Java语言控制流语句。Java语言控制流语句包括条件控制语句、循环控制语句及跳转语句等。为了保证与其他程序设计语言的兼容性,Java语言保留了goto语句的关键字,但不再使用goto语句,其功能可以由其他语句来代替。
2.3.2 条件控制语句
Java语言程序设计中,条件控制语句可以改变顺序结构,实现程序分支的功能。它根据逻辑值(true或false)或条件表达式的结果(true或false)选择执行不同的语句或语句体,其他与逻辑值或表达式的结果不匹配的语句或语句块体则被跳过不执行。Java语言不允许将一个数值作为条件控制语句的匹配值,它只允许true或false。
Java语言提供了两种条件控制语句:if语句结构和switch语句结构。
1.if语句结构
if语句是Java语言中最基本的条件控制语句,它的一般书写格式为:

当“逻辑值或条件表达式”的结果为true时,程序执行分支“语句或语句体”,然后继续向下执行;否则,程序跳过“语句或语句体”分支,继续向下执行。
说明:
(1)“逻辑值或条件表达式”的值必须是true或false。
(2)“语句或语句体”可以是一条语句也可以是多条语句。如果是多条语句,则形成了语句体,这些语句必须要用一对花括号({})括起来形成一个整体。如果是一条语句,则这一对花括号可以省略。
if语句结构的执行流程如图2-2所示。
例题2.5 封装了if语句结构的程序。

2.if-else语句结构
if-else语句是Java语言中最常用的条件控制语句,它的一般书写格式为:

当“逻辑值或条件表达式”的结果为true时,程序执行分支“语句1或语句体1”,跳过else和分支“语句2或语句体2”,然后继续向下执行;否则程序跳过分支“语句1或语句体1”,执行else和分支“语句2或语句体2”,然后继续向下执行。
说明:else子句不能单独作为语句使用,它必须与if子句成对使用。
if-else语句结构的执行流程如图2-3所示。

图2-2 if语句结构流程图

图2-3 if-else语句结构流程图
例题2.6 封装了if-else语句结构的程序。

3.if语句和if-else语句的嵌套
在Java语言条件控制流程中,有时仅仅靠一个简单的逻辑条件并不能满足程序分支要求,而是需要多个逻辑条件的组合来决定执行不同的操作,利用if语句和if-else语句的嵌套可以实现较为复杂的条件控制流程。它的一般书写格式为:


说明:除非用花括号括起来,else子句一般是与最近的没有else子句的if语句匹配成一对。
例如:存在语句片段

可以看出,else子句与第2个if语句匹配成一对。如果希望else子句与第1个if语句匹配成一对,则需要改成如下的语句片段:

if语句和if-else语句的嵌套结构的执行流程如图2-4所示。

图2-4 if语句和if-else语句的嵌套结构流程图
例题2.7 封装了if语句和if-else语句的嵌套结构的程序。


4.switch语句结构
当程序需要从多个分支中选择一个分支执行时,虽然可以使用if-else语句和if语句的嵌套来实现,但是嵌套层太多会导致程序结构烦琐,可读性差。Java语言提供了一种switch语句,可以根据表达式的指定整数值从多个分支中选择一个来执行,它的一般书写格式为:

说明:
(1)表达式的值只能是byte、short、char和int,不允许为long、float、double、boolean等。
(2)case后面的值1,值2,…,值n必须是常量,它们彼此的值应不相同,但与表达式的类型相同。
(3)当表达式的值与某个case后面的值相同时,就执行该case子句后的语句或语句体,此处的语句体可以不用花括号({})括起来。
(4)break语句的作用是用来在执行完一个case分支后,使程序跳转出switch语句,即终止switch语句的执行。如果没有break语句,当程序执行完匹配的case后面语句或语句体后,会继续执行其余的case子句,而不再判断case子句是否与表达式的值匹配,起不到条件控制的作用,除非编程用户有特殊要求。
(5)在某些情况下,多个相邻的case子句执行一组完全相同的语句或语句体,此时,这些相同的语句或语句体只需要书写在最后一个case子句中即可。
(6)default子句是可选的,可以要也可以不要。如果存在default子句,当表达式的值与任何一个case后面的值都不同时,程序就执行default后面的语句或语句体。如果不存在default子句,当表达式的值与任何一个case后面的值都不同时,程序就直接跳转出switch语句。
switch语句结构的执行流程如图2-5所示。

图2-5 switch语句结构流程图
例题2.8 封装了switch语句结构的程序。


2.3.3 循环控制语句
Java语言程序设计中,循环控制语句可以反复执行一段程序代码,直到满足终止条件为止,实现程序重复操作的功能。它根据初始化语句设置循环控制的初始条件,循环执行一段语句或语句体,或者先执行一段语句或语句体后判断循环控制的初始条件,在重复执行下一个语句或语句体之前都需要修改循环控制的迭代条件,用迭代条件与终止条件进行匹配,如果不满足终止条件,程序继续下一个循环,如果满足终止条件,则终止循环,跳转到循环体的后面程序继续执行。
Java语言提供了三种循环控制语句:for语句结构、while语句结构和do-while语句结构。
1.for语句结构
for语句是Java语言中常用的循环控制语句,通常用于已经确定循环次数的情况。它的一般书写格式为:

说明:
(1)初始化部分设置控制循环变量的初始值。初始化部分可以省略,但分号不能缺少,此时应该在for语句之前设置控制循环变量的初始值。例如:for(;aint<=10;aint++)。初始化部分可以包含多条语句,它们之间以英文半角的逗号分隔。例如:for(int aint=10,double bdouble=2.9;aint<=10;aint++)。
(2)判断终止条件部分设置控制循环是否终止的条件。判断终止条件部分可以省略,但分号不能缺少,如果没有在其他地方设置终止条件,就相当于不判断终止条件,循环无休止地进行下去,又称“死循环”。例如:for(int aint=10,double bdouble=2.9;;aint++)。
(3)迭代因子部分设置控制循环变量递增或递减,以改变判断终止条件部分的状态。迭代因子部分可以省略,此时应该在for循环的其他部分设置迭代因子部分,改变判断终止条件状态保证循环正常结束。例如:for(int aint=0;aint<=10;)。迭代因子部分可以包含多条语句,它们之间以英文半角的逗号隔开。例如:for(in taint=0,double bdouble=2.9;aint<=10;aint++,bdouble=bdouble+2)。
(4)for语句结构的三部分都可以省略,如果省略了所有的条件表达式,这样的循环是没有作用的。例如:for(;;)。
for语句结构的执行流程如图2-6所示。

图2-6 for语句结构流程图
例题2.9 封装了for语句结构的程序。


2.while语句结构
while语句是Java语言中常用的循环控制语句,既可以用于已经确定循环次数的情况,也可以用于提前不确定循环次数的情况。它的一般书写格式为:

说明:
(1)循环初始化部分通常放在while语句结构之前或者省略。
(2)while语句结构首先执行“判断终止条件部分”,当条件结果为true时执行循环体内的语句或语句体,当条件结果为false时不执行循环体内的语句或语句体。
(3)在能够提前确定循环次数的情况下,while语句结构和for语句结构可以互相替换。
while语句结构的执行流程如图2-7所示。

图2-7 while语句结构流程图
例题2.10 封装了while语句结构的程序。


3.do-while语句结构
do-while语句是Java语言中常用的循环控制语句,它的一般书写格式为:

说明:
(1)循环初始化部分可以放在do-while语句结构之前,也可以放在do-while语句结构之内,还可以省略。
(2)do-while语句结构首先执行一次循环体内的语句或语句体,再执行“判断终止条件部分”,当条件结果为true时循环执行循环体内的语句或语句体,当条件结果为false,不再执行循环体内的语句或语句体。do-while语句结构循环体内的语句或语句体至少被执行一次,而while语句结构循环体内的语句或语句体可能一次被不执行,这是do-while语句和while语句的最大区别。
do-while语句结构的执行流程如图2-8所示。

图2-8 do-while语句结构流程图
例题2.11 封装了do-while语句结构的程序。

4.循环的嵌套
循环的嵌套是指在一个循环语句结构中又包含循环语句结构的程序结构。Java语言的三种循环语句结构可以互相嵌套,无论哪种嵌套结构都必须保证自身嵌套结构的完整性,不能出现循环结构的交叉,即一个循环结构应该完整地包含在另一个循环结构体内。含有循环嵌套结构的程序在执行时应该先执行内层循环再执行外层循环。
例题2.12 封装了循环语句嵌套结构的程序。

2.3.4 跳转语句
无论是顺序结构、条件控制语句,还是循环控制语句,在程序执行过程中根据具体情况总会跳过某些语句或语句体,从而改变程序的执行流程。Java语言提供了三种常用的跳转语句:break语句、continue语句和return语句。
1.break语句
break语句可以用在switch语句结构中,表示退出switch语句结构,执行switch语句结构后面的语句。它的一般书写格式为:

break语句可以用在循环语句结构中,表示强制退出循环结构。如果break语句所处的位置是单重循环程序代码,则表示终止循环,使程序跳转到循环语句结构的后面语句,它的一般书写格式为:

如果break语句所处的位置是循环嵌套结构中的内层循环,执行单独的break语句时,只能退出当前内层循环,不能退出外层循环。如果想退出外层循环,可使用带有标号的break语句,它的一般书写格式为:

例如:

2.continue语句
continue语句只能出现在循环语句结构中,表示终止本次循环,跳过循环体中下面还没执行的语句或语句体,使程序跳转到下一次循环,它的一般书写格式为:

如果continue语句所处的位置是循环嵌套结构中的内层循环,执行单独的continue语句时,只能退出当前内层结构的本次循环。如果想退出外层结构的当前循环,可使用带有标号的continue语句,它的一般书写格式为:

例如:

3.return语句
return语句是程序执行控制流程中不可缺少的跳转语句,它一般用在方法程序代码中,表示当程序执行到return语句时,终止当前方法的执行,返回到调用该方法的语句处,从下一条语句继续执行。
如果方法的定义返回类型为void,表示调用此方法时不返回任何值,在此方法的定义最后应有一条单独的return语句,它的一般书写格式为:

当return单独作为一条语句时,Java语言程序中通常省略该语句,但并不代表return语句不存在,只是Java语言把它作为缺省语句存在了。
如果方法的定义类型不是void,表示调用此方法时返回一个与方法定义类型相同的一个结果,在此方法的定义最后应有一条带表达式的return语句,表达式的结果与方法定义类型必须相同,它的一般书写格式为:

当带有表达式的return语句存在时,Java语言程序中是不允许省略该语句的。