1.6 Java程序流控制语句
Java程序流控制语句是用来控制程序走向的,程序流控制语句是在Java程序中通过该语句执行一段程序流,程序流可以是由单一语句(例如表达式等)或是由复合语句组成的,每条完整语句的结束是以分号为标志的。
Java程序流控制主要分为两部分,分支(选择)和循环控制语句。语句使用的关键字有:分支结构控制关键字(if-else、switch-case),循环结构控制关键字(for、while、do-while),以及控制分支和循环程序流执行方向的辅助关键字(break、return、continue)等。
1.6.1 分支结构语句
分支结构程序设计提供了一种控制机制,使得程序的执行可以跳过一些语句不执行,而转去执行另一些语句。“分支”由条件控制,“条件”由逻辑或关系表达式组成,逻辑或关系表达式运算的结果true和false决定程序执行的方向。
1. if-else分支结构
if-else语句使用的语法格式为
if-else语句的功能是根据判定条件真假执行两种操作中的一种。逻辑表达式boolean-expression是任意一个返回布尔型数据的表达式,如果逻辑表达式值为true,则程序执行statements1语句,否则执行statements2语句。语句statements1,statements2可为单一语句,也可为复合语句,复合语句需要用“{}”括起来,“{}”外面不加分号。else子句是可选语句,else子句不能单独作为语句使用,需要与if配对使用,else总是与离它最近的if配对,可以通过使用“{}”改变if-else的配对关系。
使用if-else语句的原则是:尽可能在if的逻辑表达式内使其出现“为真”的概率大,可以人为判断事件发生的概率,这样做是避免执行else以及else内嵌套的if-else语句,提高程序执行效率。另外,在if逻辑表达式内应尽可能避免使用否定表达式。
【示例1-23】 比较两个数大小,并显示输出数据大的数。
2. switch-case分支结构
switch-case(多分支或开关)语句使用的语法格式为:
switch-case语句的功能是根据表达式expression的值迅速执行程序的不同部分,switch语句的作用域是该语句后的大括号{},在大括号中的语句都与switch有关,它们属于switch语句。switch语句根据表达式expression的值确定执行多个操作中的一个,表达式expression的值可以是任意一个基本数据类型的数值,switch语句把表达式运算的数值与每一个case子句中的数值相比较。如果匹配成功,即表达式所得结果等于case子句中的数值,则执行该case子句后面的语句序列。
case子句中的数值expression_ValueN是一个常量,而且所有case子句中的常量数值都是不相同的;default子句是任选项,当表达式的数值与任何一个case子句中的数值都不匹配时,程序执行default后面的语句,如果表达式的数值与任何一个case子句中的数值都不匹配并且没有default子句,程序不进行任何操作,而是直接跳出switch语句的作用域。case子句只起到一个标号作用,用来查找匹配的入口点,从此处开始执行程序,对后面的case子句不再进行匹配,而是直接执行case后的语句序列,因此应在每个case分支后用break语句终止后面case分支语句的执行。在一些特殊情况下,多个不同的case数值要执行一组相同的操作,这时可以不用break语句。case分支中包括多个执行语句时,可以不用大括号{}括起来。
break语句用来在执行完一个case分支后,使程序跳出switch语句的作用域,即终止switch语句执行。
【示例1-24】 根据整数变量i的内容决定执行哪段程序段。
上述程序中整数变量i内容为0时,与case 0:语句的常量0相匹配,因此执行System. out.println("i is zero.")语句,每条case语句后的break语句的功能是跳出switch语句的作用域。
另外,switch语句的功能可以用简单的if-else来实现,但在某些情况下,使用switch语句更为简练,可读性强,而且提高了程序执行的效率。
1.6.2 循环结构语句
Java语言提供的循环语句有for、while和do-while语句,循环语句的作用是反复执行一段代码,直到满足终止循环的条件为止。一个循环一般应包括4部分内容:初始化部分(initialization),用来设置循环的一些初始条件,例如计数器初始值设置为0等;循环体部分(body),反复循环执行的一段代码,可以是单一语句,也可以是复合语句;迭代部分(iteration),在当前循环结束、下一次循环开始时执行的语句,该语句常用来使计数器完成加1或减1的操作等;终止部分(boolean_termination),通常是一个布尔表达式,每次循环时要对该表达式求值,以验证是否满足循环终止条件。
1. For循环结构
for语句使用的语法格式为:
for语句的功能是执行循环体语句N次,N由表达式initialization(初始值)和boolean_ termination(终止条件)和iteration(迭代部分)的数值决定。for语句通常用在循环次数确定的情况下,也可根据循环结束条件执行循环次数不确定的情况。
for语句的执行过程为:首先执行初始化操作,然后判断终止条件是否满足,如果满足循环条件,则执行循环体中语句,最后执行迭代部分;每完成一次循环,重新判断终止条件,如果满足终止条件,则退出for循环语句。
for语句的作用域是该语句后的“{}”,在大括号中的语句都是循环体语句,如果for语句后没有“{}”,for语句的循环体最多只能有一条语句,在for语句初始化部分中可以声明变量,但该变量的作用域(操作该变量)只是在整个for语句确定的作用域中。
【示例1-25】 使用标准for语句的应用程序。
在上例中,初始化部分为声明一个变量i,并为i赋予初始值0,含义是该循环从i等于0开始,循环的终止条件是i小于等于10,它是一个逻辑表达式,其值为true时执行循环体内的语句,否则退出循环,迭代部分的表达式为变量i加1,每循环一次,该部分被执行一次,for语句的循环体内容为System.out.println("i="+i)。
另外,在for语句中,初始化、终止及迭代部分都可为空语句,但分号不能省略,三者均为空时,相当于一个无限循环。下面是无限循环for语句代码:
for循环语句是可以嵌套使用的。
【示例1-26】 嵌套使用的for语句的Java程序。
for语句的初始化部分和迭代部分可以使用逗号语句,逗号的作用是分隔在初始化和迭代部分的表达式语句。有时一个循环可能需要多个变量控制,即循环的终止条件是由多个变量的逻辑表达式组成的,其多个变量的初始化和迭代处理通过逗号就可以编写在一个for语句中。
【示例1-27】 多重循环的Java应用程序。
上述程序是通过两个变量控制for循环的,当i小于j时循环,其输出结果为:
2. while循环结构
while语句使用的语法格式为:
while语句的功能是执行循环体语句N次,N由逻辑表达式boolean_termination(终止条件)的数值决定。
while语句的执行过程为:首先计算终止条件,当终止条件为true时,执行循环体中的语句,否则退出while循环语句。while语句的作用域是该语句后的大括号{},在大括号中的语句都是循环体语句。当最初终止条件为false时,while循环体中的语句将不被执行。
while语句的初始化部分和迭代部分是任选项,初始化部分在while语句作用域外,迭代部分在while循环体内。
【示例1-28】 使用标准while语句的Java应用程序。
另外,在while语句也可以实现无限循环。下面是无限循环while语句代码:
3. do-while循环结构
do-while语句使用的语法格式为:
do-while语句的功能是执行循环体语句N次,N由逻辑表达式boolean_termination(终止条件)的数值决定。
do-while语句的执行过程为:首先执行循环体内的语句,然后计算终止条件,当条件为true时,继续执行循环体中的语句,否则退出do-while循环语句。do-while语句的作用域是do语句后的大括号{},在大括号中的语句都是循环体语句,do-while循环体中的语句至少被执行一次。
do-while语句的初始化部分和迭代部分是任选项,初始化部分在do-while语句作用域外,迭代部分在do-while循环体内。当终止条件为true永不改变时,do-while为无限循环语句。
【示例1-29】 使用标准do-while语句的Java应用程序。
1.6.3 辅助流控制语句
Java语言提供了一些辅助控制分支和循环程序流执行方向的语句,例如,break、continue、return等语句,break语句可以从switch-case分支结构中跳出,以及从循环体中跳出;continue语句可以跳过(不执行)循环体中的一些语句,或者退出循环体;return语句是方法体的返回语句,主要应用于方法体中,但也可以辅助控制分支或循环程序流的执行,即可以中断分支或循环体。
1. break语句
break语句使用的语法格式为:
break语句的功能是停止执行一些语句而转向执行另一些语句,break语句主要用于跳出switch语句或循环语句的作用域,即不再执行switch语句或循环体中的语句,break关键字后可跟标号,由于循环体可以嵌套,即实现多重循环,因此,标号用于指示跳出哪个循环体,如果跳出当前循环体则不需要标号。
在switch语句中,break语句用来终止switch语句的执行,即不再执行switch语句作用域内的任何语句,使程序从switch语句后的第一条语句开始执行。
在循环语句中,break语句用来跳出当前或多重循环体,即不再执行循环体内的语句。
【示例1-30】 使用break语句跳出当前循环体的Java程序。
【示例1-31】 使用带标号的break语句跳出嵌套循环体的Java程序。
2. continue语句
continue(继续)语句使用的语法格式为:
continue语句是使用在循环语句中的,其功能是结束本次循环,跳过循环体中一些未执行的语句,接着进行终止条件的判断,以决定是否继续循环,或者跳到Lable标号处继续执行一些语句。对于for语句,在进行终止条件判断之前,还要先执行迭代语句,用continue Lable语句可以跳转到“{}”指明的外层循环中,Lable是一个程序语句的标号。
【示例1-32】 使用continue语句的Java应用程序。
3. return语句
return(返回语句)语句使用的语法格式为:
return语句的功能是从当前方法中退出,返回到调用该方法的语句处,继续程序的执行,表达式expression是return语句指示的返回值,当方法声明使用void返回类型,即为空(没有返回值)时,return语句没有返回值,即不返回任何值,void类型的方法也可以省略return语句。当调用方法需要返回值时,表达式expression的数值返回给调用该方法的语句。返回值的数据类型需要与方法声明中的返回值类型一致,也可以使用强制类型转换使类型一致。
return语句通常用在一个方法体的最后,以退出该方法并返回一个值。在Java程序中,单独的return语句用在一个方法体的中间时,会产生编译警告错误,因为这时可能会有一些语句执行不到,但是可以通过把return语句嵌入某些语句(例如if-else)中使程序在未执行完方法中的所有语句时退出方法。
【示例1-33】 return作为方法返回语句的Java应用程序。
【示例1-34】 return作为中断循环体语句的Java应用程序。
1.6.4 流控制语句应用示例
下面给出几个流控制语句的应用示例。
【示例1-35】 do、for、if语句混合使用的Java应用程序。
【示例1-36】 计算1/1+1/2+1/3+…+1/100值的Java应用程序。
【示例1-37】 计算n!(整数阶乘)值的Java应用程序。
【示例1-38】 判断某年是否为闰年的Java应用程序。