
3.3 循环语句
在实际应用中,往往会遇到一行或几行代码需要执行多次的情况,这就是代码的循环。几乎所有的程序都包含循环,循环是重复执行的指令,重复次数由条件决定,这个条件称为循环条件,反复执行的程序段称为循环体。
一个正常的循环程序,具有四个基本要素,分别是循环变量初始化、循环条件、循环体和改变循环变量的值。大多数编程语言中循环语句的结构形式如图3-12所示。
Java语言为用户提供了多种循环语句,有while循环语句、do…while循环语句、for循环语句、嵌套循环语句等。具体介绍如表3-2所示。
表3-2 循环语句

3.3.1 while循环语句
while循环语句根据循环条件的返回值来判断执行零次或多次循环体。当逻辑条件成立时,重复执行循环体,直到条件不成立时终止,while循环语句的语法格式如下:

在这里,语句块可以是一个单独的语句,也可以是几个语句组成的代码块。表达式可以是任意的表达式,表达式的值非零时为true,当条件为true时执行循环;当条件为false时,退出循环,程序流将继续执行紧接着循环的下一条语句。
while循环语句的执行流程如图3-13所示。
当遇到while循环语句时,首先计算表达式的返回值,当表达式的返回值为true时,执行一次循环体中的语句块,循环体中的语句块执行完毕时,将重新查看是否符合条件,若表达式的值还返回true将再次执行相同的代码,否则跳出循环。while循环的特点:先判断条件,后执行语句。
【例3.5】编写程序,实现100以内自然数的求和,即1+2+3+…+100,最后输出计算结果(源代码\ch03\3.5.txt)。

运行结果如图3-14所示。

图3-13 while循环语句的执行流程

图3-14 while循环语句的应用
3.3.2 do…while循环语句
在Java语言中,do…while循环语句是在循环语句的尾部检查它的条件。do…while循环语句与while循环语句类似,但是也有区别。do…while循环语句和while循环语句的最主要区别:
(1)do…while循环语句是先执行循环体后判断循环条件,while循环语句是先判断循环条件后执行循环体。
(2)do…while循环语句的最小执行次数为1次,while循环语句的最小执行次数为0次。
do…while循环语句的语法格式如下:

这里的条件表达式出现在循环语句的尾部,所以循环语句中的语句块会在条件被测试之前至少执行一次。如果条件为真,控制流会跳转回上面的do,然后重新执行循环语句中的语句块,这个过程会不断重复,直到给定条件变为假为止。do…while循环语句的执行流程如图3-15所示。
程序遇到关键字do,执行花括号内的语句块,语句块执行完毕,执行while关键字后的布尔表达式,如果表达式的返回值为true,则向上执行语句块,否则结束循环语句,执行while关键字后的程序代码。
使用do…while循环语句应注意以下几点:
(1)do…while循环语句是先执行“循环体语句”,后判断循环终止条件,与while语句不同。二者的区别在于:当while后面的表达式开始的值为0(假)时,while循环语句的循环体一次也不执行,而do…while循环语句的循环体至少要执行一次。
(2)在书写格式上,循环体部分要用{}括起来,即使只有一条语句也如此;do…while循环语句最后以分号结束。
(3)通常情况下,do…while循环语句是从后面控制表达式退出循环。但它也可以构成无限循环,此时要利用break语句或return语句直接从循环体内跳出循环。
【例3.6】编写程序,实现100以内自然数的求和,即1+2+3+…+100,最后输出计算结果(源代码\ch03\3.6.txt)。

运行结果如图3-16所示。

图3-15 do…while循环语句的执行流程

图3-16 do…while循环语句的应用
3.3.3 for循环语句
for循环语句和while循环语句、do…while循环语句一样,可以循环重复执行一个语句块,直到指定的循环条件返回值为假。for循环语句的语法格式为:

参数介绍如下:
(1)表达式1为赋值语句,如果有多个赋值语句可以用逗号隔开,形成逗号表达式,循环四要素中的循环变量初始化。
(2)表达式2返回一个布尔值,用于检测循环条件是否成立,循环四要素中的循环条件。
(3)表达式3为赋值表达式,用来更新循环控制变量,以保证循环能正常终止,循环四要素中的改变循环变量的值。
for循环语句的执行流程如下:
(1)表达式1会首先被执行,且只会执行一次。这一步允许用户声明并初始化任何循环控制变量。用户也可以不在这里写任何语句,只要有一个分号出现即可。
(2)判断表达式2。如果为真,则执行循环语句块;如果为假,则不执行循环语句块,且控制流会跳转到紧接着for循环语句的下一条语句。
(3)在执行完for循环语句块后,控制流会跳回表达式3。该表达式允许用户更新循环控制变量。该表达式可以留空,只要在条件后有一个分号出现即可。
(4)条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环语句块,然后增加步值,再重新判断条件)。在条件变为假时,for循环语句终止。
for循环语句的执行流程如图3-17所示。

图3-17 for循环语句执行流程
☆大牛提醒☆
Java语言不允许省略for循环语句中的3个表达式,否则for循环语句将出现死循环现象。
【例3.7】编写程序,实现100以内自然数的求和,即1+2+3+…+100,最后输出计算结果(源代码\ch03\3.7.txt)。

运行结果如图3-18所示。

图3-18 for循环语句的应用
3.3.4 foreach语句
foreach语句是for循环语句的特殊简化版本,但是foreach语句并不能完全取代for循环语句,也就是说,并不是所有的foreach语句都可以改写为for循环语句版本。foreach不是一个关键字,只是我们习惯上将这种特殊的for循环语句格式称为foreach语句。
foreach语句在遍历数组等方面为程序员提供了很大的方便,其语法格式如下:

参数说明:
(1)循环变量不用进行初始化,且类型与遍历对象中的数据类型一致。
(2)遍历对象是指一组数据的集合,可以从第一个元素开始一个一个进行访问。
(3)遍历对象可以是数组或者类的实例对象。
【例3.8】编写程序,使用foreach语句遍历输出一个简单的数组(源代码\ch03\3.8.txt)。

运行结果如图3-19所示。

图3-19 foreach语句的应用
3.3.5 循环语句的嵌套
在一个循环语句内又包含另一个循环语句,称为循环嵌套。如果内嵌的循环语句中还包含有循环语句,这种称为多层循环。while循环语句、do…while循环语句和for循环语句之间可以相互嵌套。
1.嵌套for循环语句
Java语言中,嵌套for循环语句的语法格式如下:

嵌套for循环语句的流程如图3-20所示。

图3-20 嵌套for循环语句的流程
【例3.9】编写程序,在窗口输出数字金字塔(源代码\ch03\3.9.txt)。

运行结果如图3-21所示。
2.嵌套while循环语句
Java语言中,嵌套while循环语句的语法格式如下:

嵌套while循环语句的流程如图3-22所示。

图3-21 嵌套for循环语句的应用

图3-22 嵌套while循环语句的流程
【例3.10】编写程序,在窗口输出九九乘法表(源代码\ch03\3.10.txt)。

运行结果如图3-23所示。

图3-23 嵌套while循环语句的应用
3.嵌套do…while循环语句
Java语言中,嵌套do…while循环语句的语法格式如下:

嵌套do…while循环语句的流程如图3-24所示。

图3-24 嵌套do…while循环语句的流程
【例3.11】编写程序,在窗口输出九九乘法表(源代码\ch03\3.11.txt)。

运行结果如图3-25所示。

图3-25 嵌套do…while循环语句的应用(九九乘法口诀)
3.3.6 无限循环
如果条件永远不为假,则循环将变成无限循环。for循环语句在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,用户可以将某些条件表达式留空来构成一个无限循环。例如下面这段代码:

当条件表达式不存在时,它被假设为真。用户也可以设置一个初始值和增量表达式,但是一般情况下,Java程序员偏向于使用for(;;)结构来表示一个无限循环,运行结果如图3-26所示。

图3-26 无限循环的运行结果
☆大牛提醒☆
可以使用“break”语句终止一个无限循环。