1、本章学习目标:掌握程序控制语句的基本语法结构 掌握分支语句和循环语句的应用 理解并熟练使用程序跳转语句第第三三章章 流程控制结构流程控制结构 程序是由一系列指令组成的,这些指令称为语句。Java中有许多语句,有些语句用来控制程序的执行流程,即执行顺序,这样的语句称为“控制语句”。Java中的控制语句有以下三大类:分支语句:if和switch语句;循环语句:while、do-while和for循环语句;转移语句:break、continue和return语句。第第1 1节节part语句概述1 1方法调用语句方法调用语句如:System.out.println(Hello);2 2表达式语句表达式
2、语句由一个表达式构成一个语句,即表示式尾加上分号。比如赋值语句:x=23;3 3复合语句复合语句可以用 把一些语句括起来构成复合语句,如:z=123+x;System.out.println(How are you);语句概述语句概述4 4空语句空语句一个分号也是一条语句,叫做空语句。5 5控制语句控制语句控制语句分为条件分支语句、开关语句和循环语句。6 6packagepackage语句和语句和 import import语句语句package语句和 import语句与类、对象有关,将在以后的章节中讲解。JavaJava里的语句可分为以下六类里的语句可分为以下六类:第第2 2节节part分支
3、结构分支结构是根据表达式条件的成立与否,决定执行哪些语句的结构。其作用是让程序根据具体情况有选择性地执行代码。Java中提供的分支语句有以下两个:if条件语句 switch开关语句分支结构本节概述3.2.1if条件语句if条件语句是最常用的分支结构,其语法格式如下:if(条件表达式1)语句块1else if(条件表达式2)语句块2else if(条件表达式3)语句块3.else 语句块nif条件语句其中,其中,ifif语句需要注意以下几点:语句需要注意以下几点:所有条件表达式的结果为布尔值(true或false);当“条件表达式1”为true时执行if语句中的“语句块1”部分;当“条件表达式1
4、”为false时,执行else if语句,继续向下判断条件表达式,哪个条件表达式成立,执行相应的语句块;当所有条件表达式为false时执行else语句中的“语句块n”部分。else if可以有多个;括起来的else if、else可以省略。根据语法规则,可以将if语句分为如下三种形式。3.2.1if条件语句1.if1.if语句语句 if语句是单条件单分支语句,即根据一个条件来控制程序执行的流程。if语句的语法格式如下:if(条件表达式)语句块 需要注意注意的是,在if语句中,其中的语句块如果只有一条语句,可以省略不写,但为了增强程序的可读性,最好不要省略。if语句的流程图如图3.1所示。在if
5、语句中,关键字if后面的一对小括号()内的条件表达式的值必须为boolean类型,当值为true时,则执行紧跟着的语句块,否则,结束当前if语句的执行。3.2.1if条件语句 下述案例通过将变量a,b,c数值按大小顺序进行互换(从小到大排列),示例了if语句的使用,代码如下所示。【代码3.1】IfExample.javapackage com;public class IfExample public static void main(String args)int a=9,b=5,c=7,t=0;if(ba)t=a;a=b;b=t;if(ca)t=a;a=c;c=t;if(c=90)Syst
6、em.out.println(优秀);else if(score=80)System.out.println(良好);else if(score=70)System.out.println(中等);else if(score=60)System.out.println(及格);else System.out.println(不及格);程序运行结果如下:良好3.2.2switch开关语句 switch开关语句是由一个控制表达式和多个case标签组成,与if语句不同的是,switch语句后面的控制表达式的数据类型只能是byte、short、char、int四种类型,boolean类型等其他类型是不
7、被允许的,但从Java 7开始允许枚举类型和String字符串类型。Switch开关语句switchswitch语句的语法格式如下:语句的语法格式如下:switch(控制表达式)case value1:语句1;break;case value2:语句2;break;.case valueN:语句N;break;default:默认语句;其中,switch语句需要注意以下几点:控制表达式的数据类型只能是byte、short、char、int、String和枚举类型;case标签后的value值必须是常量,且数据类型必须与控制表达式的值保持一致;break用于跳出switch语句,即当执行完一个c
8、ase分支后,终止switch语句的执行;只有在一些特殊情况下,当多个连续的case值要执行一组相同的操作时,此时可以不用break。default语句是可选的。用在当所有case语句都不匹配控制表达式值时,默认执行的语句。3.2.2switch开关语句 switch语句执行顺序是先对控制表达式求值,然后将值依次匹配case标签后的value1,value2,valueN,遇到匹配的值就执行对应的语句块,如果所有的case标签后的值都不能与控制表达式的值匹配,则执行default标签后的默认语句块。switch语句的执行流程图如图3.4所示。3.2.2switch开关语句下述案例通过判断学生成
9、绩的等级,示例了switch开关语句的使用,代码如下所示。【代码3.4】SwitchExample1.javapackage com;public class SwitchExample1 public static void main(String args)int score=67;switch(score/10)/使用switch 判断g的等级case 10:case 9:System.out.println(优秀);break;case 8:System.out.println(良好);break;case 7:System.out.println(中等);break;case 6:S
10、ystem.out.println(及格);break;default:System.out.println(不及格);上述代码中先计算“score/10”,因score是整数,所以结果也是整数,即取整数部分值,例如:67/10=6;case 10后面没有语句,将向下进入到case 9中,即当值为10或9时都输出“优秀”。程序运行结果如下:及格3.2.2switch开关语句 从Java 7开始增强了switch语句的功能,允许控制表达式的值是Stirng字符串类型的变量或表达式,下述案例示例了switch增强功能。【代码3.5】SwitchExample2.javapackage com;pu
11、blic class SwitchExample2 public static void main(String args)/声明变量season是字符串,注意JDK版本是7以上才能支持String season=夏天;/执行swicth分支语句switch(season)case 春天:System.out.println(春暖花开.);break;case 夏天:System.out.println(夏日炎炎.);break;case 秋天:System.out.println(秋高气爽.);break;case 冬天:System.out.println(冬雪皑皑.);break;def
12、ault:System.out.println(季节输入错误);程序运行结果如下:夏日炎炎.第第3 3节节part循环结构 循环结构是根据循环条件,要求程序反复执行某一段代码,直到条件终止为止的程序控制结构。循环结构由四部分组成:初始化部分。开始循环之前,需要设置循环变量的初始值。循环条件。循环条件是一个含有循环变量的布尔表达式,循环体的执行需要循环条件来控制,每执行一次循环体都需要判断该表达式的值,用于决定循环是否继续。循环体。需要反复执行的语句块,可以是一条语句,也可以是多条语句。迭代部分。改变循环变量值的语句。Java语言中提供的循环语句有以下三种:for循环 while循环 do-wh
13、ile循环循环结构本节概述3.3.1for循环 for循环是最常见的循环语句,其语法结构非常简洁,一般用在知道循环次数的情况下,即固定循环。for循环的语法结构如下:for(初始化表达式 ;条件表达式 ;迭代表达式 )循环体 其中:初始化表达式只在循环开始之前执行一次;初始化表达式、条件表达式以及迭代表达式都可以省略,但分号不能省,当三者都省略时将成为一个无限循环(死循环);在初始化表达式和迭代表达式中可以使用逗号隔开多个语句。for循环3.3.1for循环 for循环的执行顺序是首先执行初始化表达式;接下来判断条件表达式是否为true,如果为true,则执行循环体中的语句,紧接着执行迭代表达
14、式,完成一次循环,进入下一次循环;如果条件表达式为false,则终止循环。注意注意,下次循环依然要先判断条件表达式是否成立,并根据判断结果进行相应操作。for循环执行流程图如图3.5所示3.3.1for循环下述案例使用for循环求1100整数和,示例了for循环的应用,代码如下所示。【代码3.6】ForExample1.javapackage com;public class ForExample1 public static void main(String args)/使用for循环求1100的和int sum=0;for(int i=1;i=100;i+)sum+=i;System.ou
15、t.println(1100的和是:+sum);上述代码中,for循环语句将循环体执行100次,每次循环将当前i的值加到sum中,当循环终止时,sum的值就是1100的和。程序运行结果如下:1100的和是:50503.3.1for循环 for循环可以嵌套,下述案例使用嵌套的for循环打印九九乘法表,代码如下所示。【代码3.7】ForExample2.javapackage com;public class ForExample2 public static void main(String args)/嵌套的for循环打印九九乘法表/第一个for控制行for(int i=1;i=9;i+)/第
16、二个for控制列,即每行中输出的算式 for(int j=1;j=i;j+)/输出j*i=n格式,例如2*3=6System.out.print(j+*+i+=+i*j+);/换行 System.out.println();上述代码中,第二个for循环体中的输出语句使用的是System.out.print(),该语句输出内容后不换行;而第一个for循环体中的使用System.out.println()直接换行3.3.2while循环whilewhile循环语句的语法格式如下:循环语句的语法格式如下:while(条件表达式)循环体迭代部分while循环 while循环语句的执行顺序是先判断条件表
17、达式是否为true,如果为true,则执行循环体内的语句,再进入下一次循环;如果条件表达式为false,则终止循环。while循环的执行流程图如图3.6所示3.3.2while循环下述案例使用while循环实现求1100整数和,代码如下所示。【代码3.8】WhileExample.javapackage com;public class WhileExample public static void main(String args)/使用while循环求1100的和int sum=0;int i=1;while(i=100)sum+=i;i+;System.out.println(1100的
18、和是:+sum);上述代码中,在while循环体的最后一个语句是i+,属于循环结构的迭代部分,进行循环变量的增丽运算,如果没有这条语句,则会出现死循环。程序运行结果如下:1100的和是:50503.3.3do-while循环 do-while循环与while循环类似,只是while循环要先判断后循环,而do-while循环则是先循环后判断,do-while循环至少会循环一次。do-whiledo-while循环的语法格式如下:循环的语法格式如下:do 循环体 迭代部分 while(条件表达式);do-while循环 do-while循环的执行顺序是先执行一次do语句块,然后再判断条件表达式是否
19、为true,如果为true,则进入下一次循环;如果为false,则终止循环。do-while循环的执行流程图如图3.7所示。3.3.3do-while循环下述案例使用do-while循环实现求1100整数和,代码如下所示。【代码3.9】DoWhileExample.javapackage com;public class DoWhileExample public static void main(String args)/使用do-while循环求1100的和int sum=0;int i=1;do sum+=i;i+;while(i=100);System.out.println(1100
20、的和是:+sum);程序运行结果如下:1100的和是:5050第第4 4节节part转移语句 Java语言没有提供goto语句来控制程序的跳转,此种做法提高了程序的可读性,但也降低了程序的灵活性。为了弥补这种不足,Java语言提供一些转移语句来控制分支和循环结构,使程序员更方便地控制程序执行的方向。Java语言提供了三种转移语句:break语句、continue语句和return语句。转移语句本节概述3.4.1break语句break语句用于终止分支结构或循环结构,其主要用在以下3种情况:在switch语句中,用于终止case语句,跳出switch分支结构。在循环结构中,用于终止循环语句,跳出
21、循环结构。与标签语句配合使用从内层循环或内层程序块中退出。break语句3.4.1break语句下述案例示例了使用break语句终止循环,代码如下所示。【代码3.10】BreakExample1.javapackage com;public class BreakExample1 public static void main(String args)int i=1;for(;i=10;i+)if(i=5)System.out.println(找到目标,结束循环!);/终止循环break;System.out.println(i);/打印当前的i值 /打印终止循环的i值 System.out.
22、println(终止循环的i=+i);程序运行结果如下:1234找到目标,结束循环!终止循环的i=53.4.1break语句 在嵌套的循环语句中,break语句不仅可以终止当前所在的循环,还可以直接结束其外层的循环,此时需要在break后跟一个标签,该标签用于识别一个外层循环。下述案例示例了带标签的break语句的使用,代码如下所示。【代码3.11】BreakExample2.javapackage com;public class BreakExample2 public static void main(String args)/外层循环,outer作为标识符outer:for(int i
23、=0;i 5;i+)/内层循环 for(int j=0;j 3;j+)System.out.println(i的值为:+i+j的值为:+j);if(j=1)/跳出outer标签所标识的循环。break outer;上述代码在外层for循环前增加“outer:”作为标识符,当break outer时,则跳出它所标志的外层循环。程序运行结果如下:i的值为:0 j的值为:0i的值为:0 j的值为:13.4.2continue语句 continue的功能与break有点类似,区别是continue只是忽略本次循环体剩下的语句,接着进入到下一次循环,并不会终止循环;而break则是完全终止循环。cont
24、inue语句【代码3.12】ContinueExample.javapackage com;public class ContinueExample public static void main(String args)for(int i=1;i=10;i+)if(i=5)System.out.println(找到目标,继续循环!);/跳出本次循环,进入下一次循环continue;System.out.println(i);/打印当前的i值 程序运行结果如下:1234找到目标,继续循环!6789103.4.3return语句 return语句并不是专门用于结束循环的,通常是用在方法中,以便结
25、束一个方法。return语句主要有以下两种使用格式:单独一个return关键字。return关键字后面可以跟变量、常量或表达式。例如:return 0;当含有return语句的方法被调用时,执行return语句将从当前方法中退出,返回到调用该方法的语句处。如果执行的return语句是第一种格式,则不返回任何值;如果是第二种格式,则返回一个值。return语句3.4.3return语句下述案例示例return语句的第一种格式使用,代码如下所示。【代码3.13】ReturnExample.javapackage com;public class ReturnExample public static void main(String args)/一个简单的for循环 for(int i=0;i 10;i+)System.out.println(i的值是+i);if(i=3)/返回,结束main方法 return;System.out.println(return后的输出语句);上述代码中,使用return语句返回并结束main方法,相应for循环也结束。程序运行结果如下:i的值是0return后的输出语句i的值是1return后的输出语句i的值是2return后的输出语句i的值是3本章课后作业见教材