第3章 程序流程控制
3.1
选择结构程序设计
3.2
循环结构程序设计
3.3 break
和continue
语句
第3章 程序流程控制
3.1
选择结构程序设计
Java语言提供了两条基本的分支选择语句:if语句和switch语
句。用这两个语句可以形成以下三种形式的选择结构:
(1) 双分支选择结构:if/else语句用来判定一个条件(布尔表达
式),当条件为真(true)时执行一个操作,条件为假(false)时执行另
一个操作。
(2) 单分支选择结构:省略了else的if语句在条件为真时执行
一个操作,条件为假时则跳过该操作。
(3) 多分支选择结构:switch语句则是根据表达式的值来决定
执行许多不同操作中的某一个操作。当然,使用嵌套if语句也可
以实现多分支选择结构。
第3章 程序流程控制
3.1.1 if
语句
if语句是构造分支选择结构程序的基本语句。使用if语句的
基本形式,可构造双分支选择结构程序;使用省略了else的if语
句可构造单分支选择结构程序;使用嵌套if语句可构造多分支选
择结构程序。下面分别讲述这几种形式。
1
.if
语句的基本形式
if语句的基本形式如下:
if(布尔表达式)
语句区块1
else
语句区块2
第3章 程序流程控制
图3.1 if语句的基本形式
布尔表达式
语句区块1 语句区块2
第3章 程序流程控制
说明:
(1) 这里的“布尔表达式”为关系表达式或逻辑表达式(以下
同)。
(2) “语句区块”是指一个语句或多个语句,当为多个语句
时,一定要用一对花括号“{”和“}”将其括起,使之成为一个复
合语句。例如,在下面程序的if语句中,关系表达式grade>=60
为true时,执行“语句区块1”,它由两个语句构成,所以使用了
一对花括号使其构成一个复合语句,否则,编译时会指出语法
错误;而当关系表达式grade>=60为false时,执行“语句区块
2”,它只有一个语句,可以省去花括号。
第3章 程序流程控制
【示例程序c3_1.java】 判断给出的一个成绩,输出 “通过”
或“不及格”。
public class c3_1
{ public static void main(String[ ] args)
{
int grade;
grade=86; //读者在调试时也可赋一个小于60的成绩试试看
/* 此处最好是使用一个数据输入语句,但Java从键盘读取整数或浮点数时要
使用类、对象、方法等知识。限于我们目前所学,此处用了一个赋值语句,
待读者学习了第四章后,可对该程序进行相应地修改,使其适应于各种情况
*/
第3章 程序流程控制

if(grade>=60)

{

System.out.print("通过,成绩是:");

System.out.println(grade);

}

else

System.out.println("不及格");

}

}


程序的运行结果是:
通过,成绩是:86
第3章 程序流程控制
【示例程序c3_2.java】 比较两个数的大小。

import java.awt.*;

import java.applet.*;

public class c3_2 extends Applet

{

public void paint(Graphics g)

{

double d1=43.4;

double d2=85.3;

if(d1>=d2)


第3章 程序流程控制

g.drawString(d1+" >= "+d2,25,25);

else

g.drawString(d1+" < "+d2,25,25);

}

}


第3章 程序流程控制
c3_2.html
如下:

<html>

<head><title>APPLET PROGRAM</title></head>

<body>

<APPLET CODE="c3_2.class" width=300 height=40>

</APPLET>

</body>

</html>


该程序的运行结果是:
第3章 程序流程控制
图3.2 if语句中省略了else子句的形式
语句区块
布尔表达式
第3章 程序流程控制
2.
省略了else
子句的if
语句
在if语句中,可以省略else子句以形成单分支结构。其形式
如下:
if(布尔表达式)语句区块
其执行流程如图3.2所示。
第3章 程序流程控制
【示例程序c3_3.java】 判断给出的一个成绩,当成绩小于
60时,输出“未通过”及具体成绩,其他情况什么也不输出。

public class c3_3

{ public static void main(String[ ] args)

{

int grade;


grade=56; //读者在调试时也可赋一个等于或大于60的成绩
试试看
if(grade<60)
第3章 程序流程控制

{ System.out.print("未通过,成绩是:");

System.out.println(grade);

}

}

}


该程序的运行结果是:
未通过,成绩是:56
第3章 程序流程控制
3. if
语句的嵌套
在实际问题中,往往并不是由一个简单的条件就可以决定
执行某些操作,可能需要由若干个条件来决定执行若干个不同
的操作。例如,将百分制转换为5分制的问题就是一个典型代
表。Java语言对于处理这一类问题提供了多种方法:可以用逻
辑运算符构成复杂的布尔表达式,也可以在if语句中嵌套if语
句,还可以使用switch语句。这里主要讨论嵌套if语句。
第3章 程序流程控制
读者也许已经注意到,在if语句中的“语句区块”可以是任何
合法的Java语句,当然也包括if语句本身。因此,如果在if语句的
“语句区块”中仍然是if语句,则构成if语句的嵌套结构,从而形成
多分支选择结构的程序。当然,if语句既可以嵌套在if语句后,也
可以嵌套在else语句后,其形式如下:
if(布尔表达式1)语句区块1
else if(布尔表达式2)语句区块2
else if(布尔表达式3)语句区块3
…….
else 语句区块n+1
第3章 程序流程控制
图3.3 if
嵌套结构的一种形式
第3章 程序流程控制
【示例程序c3_4.java】 使用if嵌套将百分制转换为5分制。

public class c3_4

{

public static void main(String[ ] args)

{

int grade=76;

if(grade>=90)System.out.println("成绩:优");

else if(grade>=80)System.out.println("成绩:良");

else if(grade>=70)System.out.println("成绩:中等");

else if(grade>=60)System.out.println("成绩:及格");

else System.out.println("成绩:不及格");

}

}


程序的运行结果是:
成绩: 中等
第3章 程序流程控制
4.
使用if
嵌套时的注意事项
(1) Java编译器是将else与离它最近的if组合在一起,除非用
花括号{}指定不同的匹配方式。例如下面这个程序,作者的意
图是当x和y都大于6时,输出"设备正常"的信息;而当x不大于6
时,输出"设备出错"的信息。但程序执行时,只有当x大于6,
且y小于等于6时才输出"设备出错"的信息;x不大于6时什么信
息也不输出。
第3章 程序流程控制
【示例程序c3_5.java】

public class c3_5

{

public static void main(String[ ] args)

{

int x,y;

x=3;y=14;

if(x>6)

if(y>6)

System.out.println("设备正常");

else

System.out.println("设备出错");

}

}


第3章 程序流程控制
程序运行后没有输出,与作者的意图相悖。如果希望if嵌套
按作者的意图执行,则必须用花括号将内嵌的if结构括起,写为:

if(x>6)

{ if(y>6)

System.out.println("设备正常");

}

else

System.out.println("设备出错");


这样,用花括号“{}”将第二个if结构括起,向编译器表明它是一
个省略了else的if语句,而程序中的else与第一个if结构相对应。
第3章 程序流程控制
(2) 在嵌套if语句中,同样要注意每个“语句区块”只能是“一个
语句”,当“语句区块”中包含多条语句时,必须用花括号“{}”将这
些语句括起来,使其构成一个复合语句,否则会导致语法错误或
错误的输出。例如,下面的嵌套if语句当x>6时,则不论y的值如
何,总会执行第二个输出语句,它可能与作者的意图相悖。

if(x>6)

{ if(y>6)

System.out.print("x="+x);

System.out.print("y="+x);

}


第3章 程序流程控制
3.1.2 switch
语句
当要从多个分支中选择一个分支去执行,虽然可用if嵌套语
句来解决,但当嵌套层数较多时,程序的可读性大大降低。
Java提供的switch语句可清楚地处理多分支选择问题。switch语
句根据表达式的值来执行多个操作中的一个,其格式如下:
switch(表达式)

{ case 值1:语句区块1;break; //分支1

case 值2:语句区块2;break; //分支2

……

case 值n:语句区块n;break; //分支n

[ default : 语句区块n+1;] //分支n+1

}


第3章 程序流程控制
图3.4 switch语句流程控制(虚线箭头指出缺少break语句时的流程走向)
第3章 程序流程控制
说明:
(1) switch后面的表达式的类型可以是byte,char,short和
int(不允许浮点数类型和long型);
(2) case后面的值1、值2、…、值n是与表达式类型相同的
常量,但它们之间的值应各不相同,否则就会出现相互矛盾的
情况。case后面的语句块可以不用花括号括起。
(3) default语句可以省去不要。
(4) 当表达式的值与某个case后面的常量值相等时,就执行
此case后面的语句块。
(5) 若去掉break语句,则执行完第一个匹配case后的语句块
后,会继续执行其余case后的语句块,而不管这些语句块前的
case值是否匹配,见图3.4虚线所示。
第3章 程序流程控制
【示例程序c3_6.java】 判断成绩等级。

import java.awt.*;

import java.applet.*;

public class c3_6 extends Applet

{

public void paint(Graphics g)

{

int k;

int grade=86;

k=grade/10;

switch(k) {

case 10:

case 9:


第3章 程序流程控制

g.drawString("成绩:优",25,25); break;

case 8:

case 7:

g.drawString("成绩:良",25,25); break;

case 6:

g.drawString("成绩:及格。",25,25); break;

default: g.drawString("成绩:不及格。",25,25);

}

}

}


该程序的运行结果是:
成绩:良
第3章 程序流程控制
3.1.3
条件运算符
对于一些简单的if/else语句,可用条件运算符来替代。例
如,若有以下if语句:
if (x>y)
m=x;
else
m=y;
则可用下面的条件运算符来替代:
m=(x>y)?x :y
第3章 程序流程控制
其中,“?:”被称为条件运算符;“(x>y)?x :y”被称为条
件表达式。条件表达式的语义是:若(x>y)条件为true,则表达
式的值取x的值,否则表达式的值取y的值。条件表达式的一般
形式为:
布尔表达式1
?表达式2
:表达式3
第3章 程序流程控制
在条件表达式中:
(1) 表达式2和表达式3的类型必须相同。
(2) 条件运算符的执行顺序是:先求解表达式1,若值为true
则执行表达式2,此时表达式2的值作为整个条件表达式的值,
否则求解表达式3,将表达式3的值作为整个条件表达式的值。
在实际应用中,常常将条件运算符与赋值运算符结合起
来,构成赋值表达式,以替代比较简单的if/else语句。条件运算
符的优先级高于赋值运算符,因此,其结合方向为“自右至左”。
第3章 程序流程控制
【示例程序c3_7.java】

public class c3_7

{

public static void main(String args[ ])

{

int x,y,z,a,b;

a=1;

b=2;

x=(a>b) ? a : b;

y=(a!=b) ? a : b;

z=(a<b) ? a : b;

System.out.print("/tx="+x);

System.out.print("/ty="+y);

System.out.println("/tz="+z);

}

}


运行结果是:
x=2 y=1 z=1
第3章 程序流程控制
3.2
循环结构程序设计
循环语句的作用是反复执行一段程序代码,直到满足终止
条件为止。Java语言提供的循环语句有:while语句、do-while
语句和for语句。这些循环语句各有其持点,用户可根据不同的
需要选择使用。
第3章 程序流程控制
3.2.1 while
语句
while语句的一般形式为:
while(布尔表达式)
{
循环体语句区块
}
第3章 程序流程控制
while语句中各个成分的执行次序是:先判断布尔表达式
的值,若值为假,则跳过循环体,执行循环体后面的语句;若
布尔表达式的值为true,则执行循环体中的语句区块,然后再
回去判断布尔表达式的值,如此反复,直至布尔表达式的值为
false,跳出while循环体。其执行流程如图3.5所示。
第3章 程序流程控制
图3.5 while循环结构流程图
循环体语句区块
布尔表达式
第3章 程序流程控制
【示例程序c3_8.java】 打印数字1~5。

public class c3_8

{

public static void main(String[ ] args)

{

int counter=1; //循环变量及其初始值

while(counter<=5) //循环条件

{

System.out.println("counter="+counter);

counter++; //循环变量增值

}

}

}


第3章 程序流程控制
该程序的运行结果如下:
counter=1
counter=2
counter=3
counter=4
counter=5
第3章 程序流程控制
图3.6 do-while循环结构流程图
循环体语句区块
布尔表达式
第3章 程序流程控制
3.2.2 do-while
语句
do-while语句的一般形式为:
do{
循环体语句区块
}while(布尔表达式)
第3章 程序流程控制
do-while语句中各个成分的执行次序是:先执行一次循环
体语句区块,然后再判断布尔表达式的值,若值为false则跳出
do-while循环,执行后面的语句;若值为true则再次执行循环体
语句区块。如此反复,直到布尔表达式的值为false,跳出dowhile
循环为止。其执行流程如图3.6所示。
do-while循环语句与while循环语句的区别仅在于do-while循
环中的循环体至少执行一次,而while循环中的循环体可能一次
也不执行。
第3章 程序流程控制
【示例程序c3_9.java】 计算从1开始的连续n个自然数之
和,当其和值刚好超过100时结束,求这个n值。

import java.awt.*;

import java.applet.*;

public class c3_9 extends Applet

{

public void paint(Graphics g)

{

int n=0;

int sum=0; //循环变量及其初始值

do{

第3章 程序流程控制

n++;

sum+=n; //循环变量增值

}while(sum<=100); //循环条件

g.drawString("sum="+sum,25,25);

g.drawString("n="+n,100,25);

}

}


该程序的运行结果是:
sum=105 n=14
第3章 程序流程控制
3.2.3 for
语句
for语句的一般形式为:
for(
初值表达式;布尔表达式;循环过程表达式)
{
循环体程序语句区块
}
其中:初值表达式对循环变量赋初值;布尔表达式用来判断循
环是否继续进行;循环过程表达式完成修改循环变量、改变循
环条件的任务。
第3章 程序流程控制
图3.7 for循环流程图
初值表达式
布尔表达式
循环体语句区块
循环过程表达式
第3章 程序流程控制
其中:初值表达式对循环变量赋初值;布尔表达式用来判
断循环是否继续进行;循环过程表达式完成修改循环变量、改
变循环条件的任务。
For语句的执行流程见图3.7。其执行过程是:
(1) 求解初值表达式;
(2) 求解布尔表达式,若值为真,则执行循环体语句区块,
然后再执行第(3)步;若值为假,则跳出循环体语句。
(3) 求解循环过程表达式,然后转去执行第(2)步。
第3章 程序流程控制
【示例程序c3_10.java】 求自然数1~100之间所有奇数之和。

public class c3_10

{ public static void main(String[ ] args)

{ int sum=0,odd;

for(odd=1;odd<=100;odd+=2)

{ sum +=odd; }

System.out.println("sum="+sum+" odd="+odd);

}

}


该程序的运行结果是:
sum=2500 odd=101
第3章 程序流程控制
【示例程序c3_11.java】 求解Fibonacci数列:
1,1,2,3,5,8,……的前36个数。
分析该数列可以得到构造该数列的递推关系是:

F1=1 (n=1)

F2=1 (n=2)

Fn=Fn-1+Fn-2 (n≥3)

将其写成如下的Java程序。

public class c3_11

{ public static void main(String[ ] args)

{

第3章 程序流程控制

int f1=1, f2=1; //f1为第一项,即奇位项;f2为第二项,即偶位项

for( int i=1; i<38/2; i++)

{

System.out.print("/t"+f1+"/t"+f2); //每次输出两项

if(i%2==0)System.out.println("/n"); //每输出两次共4项后换行

f1=f1+f2; //计算下一个奇位项

f2=f2+f1; //计算下一个偶位项

}

}

}


第3章 程序流程控制
运行结果如下:
1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040 1346269 2178309
3524578 5702887 9227465 14930352
第3章 程序流程控制
3.2.4 for
头的变化与逗号运算符
需要注意的是,在for语句中,for头的构件——括号内的三
个表达式——均可省略,但两个分号不可省略。当在for头的构
件中省略了任何一个表达式时,应该注意将其写在程序中的其
他位置,否则会形成“死循环”等问题。请读者务必牢记,如果
不是万不得已,最好不要使用省略这些表达式的形式,因为省
略这些表达式的形式实际上已经失去了使用for语句的意义。下
面通过一个例子来说明省略这些表达式时的情况。
第3章 程序流程控制
【示例程序c3_12.java】 编写求解 (即1+2+3+……+9+10)的程序。

public class c3_12

{

public static void main(String[ ] args)

{

int i=1; //初值表达式写在循环语句之前

int sum=0;

for(;;) //for头的三个构件全部省略

{

sum +=i++; //循环过程表达式i++写在了循环体内

if(i>10) break; //布尔表达式写在了循环体内的if语句中

}

System.out.println("sum="+sum);

}

}




10
n 1
n
第3章 程序流程控制
该程序的运行结果是:
sum=55
此外,在for结构头的构件中,“初值表达式”和“循环过程表
达式”中还可以使用逗号运算符。这也是Java中唯一使用逗号运
算符的地方。
第3章 程序流程控制
【示例程序c3_13.java】 在for循环的初值表达式中使用逗
号运算符。

public class c3_13

{

public static void main(String[ ] args)

{ int i,sum;

for(i=1,sum=0;i<=10;i++) //初值表达式中使用了逗号运算符

sum+=i;

System.out.println("sum="+sum);

}

}


该程序的运行结果是: sum=55
第3章 程序流程控制
【示例程序c3_14.java】 在“初值表达式”和“循环过程表达
式”中都使用了逗号运算符,且省略了“判定表达式”的情况。

public class c3_14

{ public static void main(String[ ] args)

{ int i,sum;

//下面的for循环中省略了判定表达式,其余位置使用了逗号运算符

for(i=1,sum=0; ; i++,sum+=i)

if(i>10)break; //循环体改成了判定跳转语句

System.out.println("sum="+sum);

}

}


该程序的运行结果是:
sum=65
第3章 程序流程控制
3.2.5
循环语句比较
前面通过示例程序讲述了三种循环语句的用法。一般情况
下,Java系统提供的三种循环语句是可以相互替代的,尤其是
对于那些确切地知道所需执行次数的循环。然而,由于for语句
头中包含了控制循环所需要的各个构件,因此,对于同样的问
题,使用for循环编写的程序最简洁清晰。如果读者将求自然数
1~10之和的问题分别用三种循环结构写出,就可以清楚地看到
这一事实。对于那些只知道某些语句要反复执行多次(至少执行
一次),但不知道确切的执行次数时,使用do…while循环会使程
序更清晰。对于那种某些语句可能要反复执行多次,也可能一
次都不执行的问题,当然是使用while循环最好了。
第3章 程序流程控制
3.2.6
循环控制要点
循环控制主要有两种办法,一是用计数器控制循环,另一
种是用标记控制循环。
大多数循环结构程序是利用计数器的原理来控制的。设计
计数器控制循环的程序,需要把握下面几个要点:
(1) 循环控制变量(或循环计数器)的名字,即循环变量名。
(2) 循环控制变量的初始值。
(3) 每执行一次循环时,循环控制变量的增量(或减量)。
(4) 测试循环控制变量的终值条件(即是否继续进行循环)。
第3章 程序流程控制
仔细分析前面的示例程序,可以看出,用三种不同的循环语
句编写的程序中,都具有上述四个方面的内容,其中以for语句
最为典型,它把所有这些构件都放在了for头中,图3.8明确地指
出这些方面。
标记控制循环主要适用于那些事先无法知道循环次数的事务
处理。例如统计选票就是这样一类问题,只知道有许多人参加投
票,但不能确切地知道选票数。在这种情况下可以使用一个叫做
标记值的特殊值作为“数据输入结束”的标志,用户将所有合法的
数据都输入之后,就输入这个标记值,表示最后一个数据已经输
入完了。循环控制语句得到这个标记值后,结束循环。标记控制
循环通常也称作不确定循环,因为在循环开始执行之前并不知道
循环的次数。下面的程序使用“#”作为循环控制标记。
第3章 程序流程控制
图3.8 一个典型for头的组成构件
关键字
for
循环控制
变量名
控制变量
初始值
控制变量
最终值
控制变量
递增
for ( int odd = 1 ; odd <= 100; odd+=2)
第3章 程序流程控制
【示例程序c3_15.java】 设有李、王、张三人竞选领导,
由群众投票表决,试设计一个统计选票的程序。
import java.io.*;
public class c3_15
{
public static void main(String[ ] args)throws IOException
{
BufferedReader keyin=new BufferedReader(new
InputStreamReader(System.in));
第3章 程序流程控制
//上面一条语句是有关键盘输入数据流处理的,详细内容将在
第12章讲解

int Ltotal=0,Wtotal=0,Ztotal=0;

char name;

String c1;

System.out.print("enter letter L or W or Z name, # to end:");

c1=keyin.readLine( );//从键盘上读取一个字符串赋给c1

name=c1.charAt(0);// charAt(0)是从一个字符串中截取第0个

字符的方法

while(name!='#')

{

第3章 程序流程控制

switch(name)

{

case 'L':

case 'l': //李姓人的得票, 列出两个case分别处理大、小写字母

Ltotal=Ltotal+1; break;

case 'W':

case 'w': //王姓人的得票

Wtotal=Wtotal+1; break;

case 'Z':

case 'z': //张姓人的得票

Ztotal=Ztotal+1; break;

}//switch语句结束

第3章 程序流程控制

System.out.print("enter letter L or W or Z name ,# to end:");

c1=keyin.readLine( );

name=c1.charAt(0);

}//while循环结束

System.out.println(" Ltotal="+Ltotal);

System.out.println(" Wtotal="+Wtotal);

System.out.println(" Ztotal="+Ztotal);

}

}

第3章 程序流程控制

该程序的运行结果如下:

enter letter L or W or Z name,# to end:L

enter letter L or W or Z name,# to end:l

enter letter L or W or Z name ,# to end:L

enter letter L or W or Z name ,# to end:W

enter letter L or W or Z name ,# to end:w

enter letter L or W or Z name ,# to end:Z

enter letter L or W or Z name ,# to end: #

Ltotal=3

Wtotal=2

Ztotal=1

第3章 程序流程控制

3.2.7

循环嵌套

循环嵌套是指在循环体内包含有循环语句的情形。Java语

言提供的三种循环结构可以自身嵌套,也可以相互嵌套。循环

嵌套时应该注意的是:无论哪种嵌套关系都必须保证每一个循

环结构的完整性,不能出现交叉。下面几种循环嵌套都是合法

的形式:

第3章 程序流程控制

(1) while( ) //外循环开始 (2) for( ; ; ) //外循环开始

{ …… { ……

while( ) //内循环开始 for( ; ; ) //内循环开始

{……}//内循环结束 { …… } //内循环结束

}//外循环结束 } //外循环结束

第3章 程序流程控制

(3) do //外循环开始 (4) for(; ;) //外循环开始

{ …… { ……

do //内循环开始 while( ) //内循环开始

{ …… { …… }//内循环结束

}while( ); //内循环结束 ……

}while( ); //外循环结束 } //外循环结束

第3章 程序流程控制

(5) while( ) (6) do

{ …… {

do ……

{ for(; ;)

…… { …… }

}while( ); ……

} } while( );

第3章 程序流程控制

【示例程序c3_16.java】 编程打印三角形数字图案。

public class c3_16

{ public static void main(String[ ] args)

{ for(int i=1;i<=10;i++) //外层for循环

{ for(int j=1;j<=11-i;j++) //内嵌for循环

System.out.print(" "); //内嵌for循环的循环体

for(int j=1;j<=i;j++) //并列的内嵌for循环

{ if(i>=10)

System.out.print(+i+" ");

else

System.out.print(+i+" ");

} //并列的内嵌for循环结束

System.out.println(" ");

} //外层for循环结束

}

}

第3章 程序流程控制

该程序的执行结果如下:

1

2 2

3 3 3

4 4 4 4

5 5 5 5 5

6 6 6 6 6 6

7 7 7 7 7 7 7

8 8 8 8 8 8 8 8

9 9 9 9 9 9 9 9 9

10 10 10 10 10 10 10 10 10 10

第3章 程序流程控制

【示例程序c3_17.java】 编写求解 (即1!+2!+3!+……+7!+8!)的程序。

public class c3_17

{

public static void main(String[ ] args)

{ int n=1,m,s,k=0;

while(n<=8)

{ for(s=1,m=1;m<=n;m++)

s=s*m; //计算n!,结果存于s中

k=k+s; //计算前n项阶乘之和,结果存于k中

System.out.println(n+"!="+s+" k="+k);

n++;

}

}

}



8

1

!

n

n

第3章 程序流程控制

程序的运行结果如下:

1!=1 k=1

2!=2 k=3

3!=6 k=9

4!=24 k=33

5!=120 k=153

6!=720 k=873

7!=5040 k=5913

8!=40320 k=46233

第3章 程序流程控制

3.3 break


和continue
语句
3.3.1 break
语句
break语句通常有不带标号和带标号两种形式:
break;
break Lab;
其中:break是关键字;Lab是用户定义的标号。
第3章 程序流程控制
break语句虽然可以独立使用,但通常主要用于switch结构和
循环结构中,控制程序的执行流程转移。Break语句的应用有下
列三种情况:
(1) break语句用在switch语句中,其作用是强制退出switch结
构,执行switch结构后的语句。这一功能已在3.1.2节中陈述。
(2) break语句用在单层循环结构的循环体中,其作用是强制
退出循环结构。若程序中有内外两重循环,而break语句写在内
循环中,则执行break语句只能退出内循环,而不能退出外循环。
若想要退出外循环,可使用带标号的break语句。
(3) break lab语句用在循环语句中,必须在外循环入口语句
的前方写上lab标号,可以使程序流程退出标号所指明的外循环。
第3章 程序流程控制
【示例程序c3_18.java】 求1到100间的素数。
素数也称为质数,是不能被2到比它自身小1的任何正整数
整除的自然数,如3,5,7等都是素数。解决该问题的算法可
用伪代码描述如下:
(1) 构造外循环得到一个1~100之间的数i,为减少循环次
数,可跳过所有偶数;
(2) 构造内循环得到一个2~m之间的数j,令m=;
{考察i是否能被j整除,若能整除则i不是素数,结束内循环;}
(3) 内循环结束后判断j是否大于等于m+1,若是,则i必为
素数,打印输出之;否则,再次进行外循环。
第3章 程序流程控制
将上述伪代码写成java程序如下:

public class c3_18

{

public static void main(String[ ] args)

{ int n=0,m,j,i;

for(i=3;i<=100;i+=2) //外层循环

{ m=(int)Math.sqrt((double)i);

for(j=2;j<=m;j++) //内嵌循环

if((i%j)==0) break; //内嵌循环结束

if(j>=m+1)

{

第3章 程序流程控制

if(n%6==0)System.out.println("/n"); //换行控制

System.out.print(i+" ");

n++;

}

} //外层循环结束

}

}


第3章 程序流程控制
该程序的执行结果如下:
3 5 7 11 13 17
19 23 29 31 37 41
43 47 53 59 61 67
71 73 79 83 89 97
第3章 程序流程控制
【示例程序c3_19.java】 求自然数1到50间的素数。
解此题可改写示例程序c3_18.java,外循环控制仍是1到
100,但当外循环执行到第51次时,在内循环中利用带标号的

break语句使其终止。

public class c3_19

{

public static void main(String[ ] args)

{ int n=0,m,j,i;

p1: for(i=3;i<=100;i+=2) //外层循环,前面有标号p1

{ m=(int)Math.sqrt((double)i);

第3章 程序流程控制

for(j=2;j<=m;j++) //内嵌循环

{ if((i%j)==0)break;

if(i==51)break p1; //条件成立时结束标号p1所指明的循环

} //内嵌循环结束

if(j>=m+1)

{ if(n%6==0) System.out.println("/n");

System.out.print(i+" ");

n++;

}

} //外循环结束

}

}


第3章 程序流程控制
运行结果如下:
3 5 7 11 13 17
19 23 29 31 37 41
43 47
第3章 程序流程控制
3.3.2 continue
语句
continue语句只能用于循环结构中,其作用是使循环短路。
它有下述两种形式:
continue;
continue lab;
其中:continue是关键字;Lab为标号。
第3章 程序流程控制
(1) continue语句也称为循环的短路语句。在循环结构中,
当程序执行到continue语句时就返回到循环的入口处,执行下
一次循环,而使循环体内写在continue语句后的语句不执行。
(2) 当程序中有嵌套的多层循环时,为从内循环跳到外循
环,可使用带标号的continue lab语句。此时应在外循环的入口
语句前方加上标号。
第3章 程序流程控制
【示例程序c3_20.java】 使用continue语句改写示例程序c3_16.java。

public class c3_20

{

public static void main(String[ ] args)

{ int j;

p1: for(int i=1;i<=10;i++)

{ j=1;

while(j<=11-i)

{

System.out.print(" ");

j++;

}


第3章 程序流程控制

for(j=1;j<=i;j++)

{

if(i==3) continue; //当i等于3时,不论j为何值,

//均不执行后面的两条语句

if(j==9) continue p1; //当j等于9时,跳到外循环入口处

System.out.print(+i+" ");

}

System.out.println(" ");

}

}

}


第3章 程序流程控制
该程序的运行结果如下:
1
2 2
4 4 4 4
5 5 5 5 5
6 6 6 6 6 6
7 7 7 7 7 7 7
8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10