Java软件设计基础 3. 流程控制
3.1 语句控制结构 语句类型 变量声明语句 表达式语句 复合语句 用来声明变量,格式为: 在一个表达式的最后加上一个分号构成的语句,分号是语句不可缺少的部分,格式为: 复合语句 将相关语句组合在一起就构成复合语句,复合语句用{ }括起来。 [修饰符] 类型名 变量名1[,变量名2][,…]; [修饰符] 类型名 变量名1[=初值1][,变量名2][=初值2][,…]; 变量=表达式;
控制语句(control statement) 空语句 空语句是什么都不做的语句,形式为: 方法调用语句 方法是一系列相关的程序语句的集合,能实现一定的功能。可以直接调用已定义好的方法来简化程序的编写。格式为: package和import语句 泛指包含package(包)和import的语句,与类、对象有关。 控制语句(control statement) 通常源文件中的语句按照它们出现的顺序从头到尾执行,但是控制语句通过使用决策、循环和分支来改变执行流程,使程序按照条件执行特定的代码块。控制语句分为以下几类: ; 定位标识.方法名(参数列表);
顺序结构:在程序执行时,根据程序中语句的书写顺序依次执行的命 令序列。 分支结构:又成为选择结构,是在程序执行时,根据不同的条件,选 择执行不同的程序语句,用来解决有选择、有转移等诸多问题,完成应 用程序中的智能判断功能。
循环结构:使某些语句或程序段按条件重复执行若干次,直至该特定 条件不满足为止。循环有以下特点: a.只有一个入口和出口; b.结构内的每部分都有机会被执行; c.结构内没有“死循环”,即无终止循环或无限循环。
3.2 分支结构 if条件语句 if-then语句 if-then-else语句 说明 是所有控制语句中最基础的语句,只有特定检测结果为true时,它才通知程序执行特定的代码段。 if-then-else语句 当if子句的计算结果为false时,该语句提供第二个执行路径。 说明 条件表达式是任意一个返回布尔型数据的表达式; 简单语句可以省略前面的花括号。 决定什么时候省略括号是个人的习惯,但会导致代码更加脆弱。如果 以后在then语句后面加入第二个语句,常见的错误是忘记加上必须的括 号。编辑器不能识别这样的错误,将会得到错误的结果。 以上两种条件语句的结构和格式如下:
首先计算布尔表达式,若为真,则执行语句1,否则就直接转入if语句的后续语句
上述语句不能产生正确的结果。该错误很难发现,因为这并非编译错误或者是运行时错误。这属于逻辑错误。 复合条件 若if语句的布尔表达式由一个简单判断给出,称为简单条件;若由多个简单条件经过逻辑运算而得到,称为复合条件。
嵌套条件语句 Java中没有提供象elseif这样的关键字来进行多条件分支。三种选择或以上的分支就需要利用if语句的嵌套来实现。程序从上往下依次判断布尔表达式的条件,一旦某个条件满足,就执行相关语句,然后就不再判断其余的条件,直接转到if语句的后续语句去执行。else总是与离它最近的if语句配对。
优秀的书写方式:
I/O编程经常涉及到人可以阅读的简洁的格式化数据转换。JAVA平台提供扫描器Scanner把输入分割成和数据位相关联的记号,格式化数据。默认情况下,扫描器使用空白分隔记号。
switch多分支语句 允许使用任意数量的可能执行路径,当分支过多时,比嵌套条件语句更具有直观性、便捷性。格式如下:
说明 显然,通过if-else语句的嵌套也能实现switch语句的功能,但通常使用switch语句更简练,而且可读性强,程序的执行效率也高; 表达式的返回类型必须是byte,short,char和int四种类型,或者是以后将讨论的枚举类型(enumerated type),还可以是“包装”特定原始类型的几个特殊类:Character,Byte,Short和Integer; case子句中的值必须是常量,且值应该不相同; case的分支中有多个执行语句时不必用“{ }”括起; default子句是可选的,它处理没有被任何case语句显式处理的值。若表达式中的值与所有case都不相配,且没有default子句,则跳出switch语句; break语句的作用是执行完一个case分支后使程序跳出switch语句块,它是可选的,如果没有这条语句,流程控制将一个接一个的执行后续的case操作,这样分支语句将变得效率极低且容易误操作。但是有时候程序员也会将其省略以达到某些特殊需要。
在一些特殊情况下,多个不同的case值要执行一组相同的操作,可以写成如下形式:
执行过程 计算表达式的值,同case分支比较,如果相同则执行相应的语句块,否则继续向下比较,直至找到相同的case值或者到达default分支; 在default分支不存在的情况下,则跳出整个switch语句; Switch语句的每一个case判断,都只负责指明流程分支的入口点,而不负责分支的出口点,分支的出口点需要编程人员用相应的跳转语句来标明。
3.3 循环语句 while语句 是Java最基本的循环语句,格式如下: 其中,while是关键字,布尔表达式是循环条件,语句为循环体。 执行过程如下:首先判断布尔表达式,若为真,则执行循环体,然后再判断条件,直到布尔表达式的值为假,停止执行语句。
注意: 该语句是先判断后执行,若一开始条件就不成立,则不执行循环体; 在循环体内部一定要有改变条件的语句,否则是死循环。 do-while语句 格式: do-while语句是“先执行后判断”型,先执行一次循环体中的语句,然后测试布尔表达式的值,若为true,则继续执行循环,否则执行do-while语句的后续语句。
例程
for语句 是三种循环语句中功能较强、形式灵活、使用较频繁的循环语句结构,尤其适合于循环次数清晰的场合。
执行过程: 按表达式1将初值赋给循环控制变量; 按布尔表达式判断循环是否成立,即判断控制变量的值是否满足布尔表达式的条件,若条件不成立,则转步骤⑤;若条件成立,则执行循环; 按表达式3修改控制变量; 返回步骤②; 结束循环,执行for语句的后续语句。 for语句中循环控制变量必须是有序类型。循环控制变量初值和终值通常是与控制变量类型相一致的常量,也可以是表达式。对控制变量的初始化只执行一次,而循环次数由初值和终值决定。
其他形式: 当“表达式1”、“表达式2”、“表达式3”都为空的时候,相当于一个无限循环,如: 有时,for语句在“表达式1”和“表达式3”的位置上需要包含多个语句,由于不能在for语句的“( )”中使用“{ }”来定义复合语句,因此提供了用逗号分隔的语句系列。如:
例程 在for语句的圆括号的后面加个分号,则相当于for语句的循环体为空语句。例如:
增强的for语句 用于在集合和数组之中进行迭代,可以使循环更加紧凑和容易阅读。 注意:在这个程序中,变量item保存从数字数组获得的当前值。只要情况允许,尽量使用for循环的增强形式。
循环嵌套 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多重循环。while、do-while、for之间都可以互相嵌套使用。
跳转语句用来实现程序执行过程中流程的转移。 3.4 跳转语句 跳转语句用来实现程序执行过程中流程的转移。 goto语句使程序结构混乱,可读性差; Java语言取消了goto语句,通过break语句、continue语句和return语句实现流程的转移。 break语句 使程序的流程从一个封闭语句块(如switch)中跳出来,也可以用于退出一个循环(如do、for、while),此外,还可以跳到相应的标记位。 分类: 不带标号的break语句 从它所在的switch分支或最内层循环中跳出来,执行分支或循环体后 面的语句。 不能用于循环语句和switch语句之外的其他任何语句中。
带标号的break语句 break语句的语法格式如下: 设置标记的语句格式: break 标号; “标号”是程序中设置好的标记名,程序跳到标号所在的语句或者语句 块的下一句开始执行。 break语句必须在加标记的代码块的内部才可以跳到标记位。 break终止带加标记的语句,不是把控制流转移到标记位置,而是转移 到紧跟在标记的语句(块)后面的语句。 可以把标号设置在任意的语句或语句块之前。 break 标号; 标号: 语句
continue语句 continue语句只能在循环语句中使用。 它和break语句的区别是:continue语句只终止本次循环,而不是终止整个循环;而break语句则是结束整个循环语句的执行。 continue语句同样有两种格式: 不带标号 终止本次循环,即跳过循环体中continue语句后面的语句,回到循环 体的条件测试部分继续执行。注意:只能跳过本次循环的剩余语句。 带标号的情况 跳过标号指出的语句块中的所有余下语句部分,回到标号所指语句块 的条件测试部分继续执行。 标号应该定义在程序中外层循环语句的前面,用来标志这个循环结构。 带标号的continue语句使程序的流程直接转入标号标明的循环层次。 continue 标号; 标号: 语句
return语句 用来从当前方法中退出,可使正在执行的分支程序返回到调用它的方法的相应语句处,并从紧跟该语句的下一条语句继续执行,格式如下: 说明: 表达式的值就是被调用方法的返回值,如果方法没有返回值,则return语句中的表达式可以省略; 如果方法中没有出现return语句,则执行完方法中的最后一条语句后自动返回调用它的方法。 return [表达式];