分支语句
1.条件语句
条件语句根据判定条件的真假来决定执行哪一种操作。
1.If结构
Java语言中,最简单的条件语句是if结构,采用的格式如下:
if(条件)tatement;或者
if(条件){block}
第一种情况下,在条件为真时,执行一条语句statement;否则跳过statement 执行下面的语句。
第二种情况下,在条件为真时,执行多条语句组成的代码块block;否则跳过block 执行下面的语句。
上述格式中的“条件”为关系表达式或布尔逻辑表达式,其值为布尔值。
2.if-else结构
Java 语言中,较常见的条件语句是if-else结构。采用的格式如下:
if(条件)
statementl;或{block}
else
statement2;或{block2}
在条件为真时,执行语句statementl(或代码块blockl),然后跳过else和statement2(或代码块block2)执行下面的语句;
在条件为假时,跳过语句statementl(或代码块blockl)执行else后面的statement2(或代码块block2),然后继续执行下面的语句。
注意:else子句不能单独作为语句使用,它必须和if子句配对使用。
3.if-else if结构
当需要处理多个分支时,可以使用if-else if结构。采用的格式如下:
if(条件l)
statementl;或{block1};
else if(条件2)
statement2;或{block2!}
.…
else if(条件N)
stalementN;或IblockN!
[elae
statementN+1;或{blockN+1}
if-else if结构的流程如图4-1所示。其中,else部分是可选的。else总是与离它最近的if配对使用。
4.嵌套使用的条件结构
根据实际需要,在每一个代码块(block)中都可以嵌人另外的条件语句结构。这种情况使得程序结构比较凌乱,使用时要特别注意if和else的搭配。
2.多分支语句
处理多个分支时,使用if-elseif结构显得非常繁琐。Java语言提供了多分支语句switch。
switch 语句根据表达式的值从多个分支中选择一个来执行,它的一般格式为:
对switch 语句说明如下:
- (1)表达式expression只能返回这几种类型的值:int、byte、short和char。多分支语句把表达式返回的值依次与每个case子句中的值相比较。如果遇到匹配的值,则执行该case子句后的语句序列。
- (2)case子句中的值valuel必须是常量,而且所有case子句中的值应是不同的。
- (3)default子句是任选的。当表达式的值与任一case子句中的值都不匹配时,程序执行default后面的语句;如果表达式的值与任一case子句中的值都不匹配且没有default子句,则程序不做任何操作,而是直接跳出switch语句。
- (4)break 语句用来在执行完一个case分支后,使程序跳出switch 语句,即终止switch语句的执行。因为case子句只是起到一个标号的作用,用来查找匹配的入口并从此处开始执行。如果没有break语句,当程序执行完匹配的case 语句序列后,后面的case子句起不到跳出switch语句的作用,这样,程序还会继续执行后面的case语句序列,一般说来这是不允许的,除非编程人员有自己独特的考虑。因此应该在每个case分支后,用break 语句终止后面的case分支语句序列的执行。
- 在一些特殊情况下,多个相邻的case分支执行一组相同的操作。为了简化程序的编写,相同的程序段只需出现一次,即出现在最后一个case分支中。这时为了保证这组case分支都能执行正确的操作,只在这组case分支的最后一个case分支后加break 语句,组中其他case分支则不使用break语句。
- (5)case分支中包含多条语句(即statementl为一连串语句序列)时,可以不用大括号1括起。
- (6)switch 语句的功能可以用if-else if结构来实现,但在某些情况下,使用switch 语句更简练,可读性强,而且程序的执行效率也得到提高。
- 与if-elseif结构相比,switch 语句在数据类型上受到了限制,即只能使用int、byte、short和char型。如果比较的数据类型是double型,便不能使用awitch结构,这是Java的不足之处。
循环语句
在程序设计中,有时需要反复执行一段相同的代码,直到满足一定的条件为止。为简化程序结构,与其他任何计算机语言一样,Java也提供了循环语句。一个循环语句一般应包含4部分内容。
- (1)初始化部分(initialization):用来设置循环控制的一些初始条件,如设置计数器等。
- (2)循环体部分(body):这是反复执行的一段代码,可以是单一的一条语句,也可以是复合语句(代码块)。
- (3)迭代部分(iteration):用来修改循环控制条件。常常在本次循环结束,下一次循环开始前执行。例如,使计数器递增或递减。
- (4)判断部分(termination):也称终止部分。是一个关系表达式或布尔逻辑表达式,其值用来判断是否满足循环终止条件。每执行一次循环都要对该表达式求值。
while 循环
while 循环又称“当型”循环,它的一般格式为:
[initialization] while(termination) { body; [iteration;] }
说明如下:
- (1)首先初始化控制条件,这部分是任选的。
- (2)当布尔表达式(termination)的值为true时,循环执行大括号中的语句,其中迭代部分是任选的。若某次判断布尔表达式的值为false,则结束循环的执行。
- (3)while循环首先计算终止条件,当条件满足时,才去执行循环体中的语句或代码块;若首次计算条件就不满足,则大括号中的语句或代码块一次都不会被执行。这是“当型”循环的特点。
- (4)while 循环通常用于循环次数不确定的情况,但也可以用于循环次数确定的情况。
- while循环的流程如图4-3所示。
do-while循环
do-while循环又称“直到型”循环,它的一般格式为:
[initialization]
do{
body;
[iteration;]
}while(termination);
说明如下:
- (1)do-while结构首先执行循环体,然后计算终止条件,若结果为true,则循环执行大括号中的语句或代码块,直到布尔表达式的结果为false。
- (2)与while结构不同的是,do-while结构的循环体至少被执行一次,这是“直到型”循环的特点。
do-while 循环的流程如图4-4所示。
for 循环
当事先知道了循环会被重复执行多少次时,可以选择Java提供的确定循环结构——for循环。for循环的一般格式为:
for(initialization;termination;iteration)
{
body;
}
说明如下:
- (1)for循环执行时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。完成一次循环后,重新判断终止条件。
- (2)可以在for循环的初始化部分声明一个变量,它的作用域为整个for循环。
- (3)for循环通常用于循环次数确定的情况,但也可以根据循环结束条件完成循环次数不确定的情况。
- (4)在初始化部分和迭代部分可以使用逗号语句来进行多个操作。逗号语句是用逗号分隔的语句序列。
- (5)初始化、终止以及迭代部分都可以为空语句(但分号不能省),三者均为空的时候,相当于一个无限循环。
- (6)for循环与while循环是可以相互转换的。更确切地说,for 循环等同于一个while循环。
跳转语句
break语句
break语句的最常用的用法是在switch语句中,通过break 语句退出switch语句,使程序从switch结构后面的第一条语句开始执行。
continue 语句
break 语句用来退出循环,并从紧跟该循环语句的第一条语句处开始执行;
而continue语句则跳过循环体中下面尚未执行的语句,回到循环体的开始继续下一轮的循环。
当然,在下一轮循环开始前,要先进行终止条件的判断,以决定是否继续循环,
对于for语句,在进行终止条件的判断前,还要先执行迭代语句。
continue语句的格式为:
continue;
也可以使用标签化的continue 语句跳转到括号指明的外层循环中,这时的格式为:
continue outerLable;
return 语句
return 语句从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续程序的执行。返回语句有两种格式:
return expression;
return;
return 语句通常用在一个方法体的最后,否则会产生编译错误,除非用在if-else 语句中。
循环语句与分支语句的嵌套
一个循环体内又可包含另一个完整的循环语句,构成多重循环语句。
循环语句与分支语句可相互嵌套,以实现复杂算法。
分支语句的任意一个分支中都可以嵌套一个完整的循环语句,
同样循环体中也可以包含完整的分支语句。
递归
递归(recursion)是常用的一种解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将直接或间接地调用自身的方法。利用递归,可以用简单的程序来解决某些复杂的计算问题。例如,大多数速度极快的排序方法,使用的就是递归算法。
递归结构的主要内容包括两个部分:
-
(1)定义递归头。如果递归结构只是一味地自己调用自己将构成无限循环,所以任何一个递归方法都必须有一个“递归头”,即当同性质的问题被简化得足够简单时,将可以直接获得问题的答案,而不必再调用自身。例如当求n!的问题被简化成求1!的问题时,可以直接获得1!
的答案为1,这就是递归头。 -
(2)定义如何从同性质的简化问题求得当前问题。一个问题的解答将依赖于一个同性质问题的解答,而解答这个同性质问题实际上就是用不同的参数(体现范围缩小)来调用递归方法自身。例如求n!这个问题被划分为求(n-1)!和把(n-1)!与n相乘两个步骤。通过这样的划分,求n!的问题被简化成求(n-1)!的问题,同理,求(n-l)!的问题被简化成求(n-2)!的问题,依此类推……
执行递归方法时,首先逐级递归调用展开,如从调用Factorial(n)到调用Factorial(n-1),再到调用Factorial(n-2)…,当达到递归头时再逐级返回,依次求得Factorial(1),Factorial(2),
…,Factorial(n-1),直到最后得到Factorial(n)的结果。