4.3 循环结构 4.3.1 While循环语句 4.3.2 do while循环语句

4.3 循环结构

循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。当反复执行这个循环体时,需要在合适的时候把循环条件改为假,从而结束循环,否则循环将一直执行下去,形成死循环。循环语句可能包含如下4个部分:

  • 初始化语句(init Statement):一条或多条语句,这些语句用于完成一些初始化工作,初始化语句在循环开始之前执行
  • 循环条件(test Expression):这是一个boolean表达式,这个表达式能决定是否执行循环体。
  • 循环体(body Statement):这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行。如果这个代码块只有一行语句,则这个代码块的花括号是可以省略的。
  • 迭代语句(iteration Statement):这个部分在一次循环体执行结束后,对循环条件求值之前执行,通常用于控制循环条件中的变量,使得循环在合适的时候结束。

上面4个部分只是一般性的分类,并不是每个循环中都非常清晰地分出了这4个部分。

4.3.1 While循环语句

while循环的语法格式

1
2
3
4
5
[初始化语句]
while(循环条件){
循环体
[迭代语句]
}

while循环每次执行循环体之前,先对循环条件求值,如果循环条件true,则运行循环体部分。从上面的语法格式来看,迭代语句总是位于循环体的最后,因此只有当循环体能成功执行完成时,while循环才会执行迭代语句.
从这个意义上来看,while循环也可被当成条件语句:如果循环条件一开始就为false,则循环体部分将永远不会获得执行。

程序示例 简单的while循环

下面程序示范了一个简单的while循环。

1
2
3
4
5
6
7
8
9
10
// 循环的初始化条件
int count = 0;
// 当count小于10时,执行循环体
while (count < 10)
{
System.out.println(count);
// 迭代语句
count++;
}
System.out.println("循环结束!");

如果while循环的循环体部分和迭代语句合并在一起,且只有一行代码,则可以省略while循环后的花括号。但这种省略花括号的做法,可能降低程序的可读性
如果省略了循环体的花括号,那么while循环条件仅控制到紧跟该循环条件的第一个分号处。

死循环

使用while循环时,一定要保证循环条件有变成false的时候,否则这个循环将成为一个死循环,永远无法结束这个循环。
例如如下代码:

1
2
3
4
5
6
7
8
// 下面是一个死循环
int count = 0;
while (count < 10)
{
System.out.println("不停执行的死循环 " + count);
count--;
}
System.out.println("永远无法跳出的循环体");

在上面代码中,count的值越来越小,这将导致count值永远小于10,使得循环条件count<10一直为true,从而导致这个循环永远无法结束。

循环条件后面不要加分号

除此之外,对于许多初学者而言,使用while循环时还有一个陷阱:while循环的循环条件后紧跟个分号。比如有如下程序片段:

1
2
3
4
5
6
7
8
int count = 0;
// while后紧跟一个分号,表明循环体是一个分号(空语句)
while (count < 10);
// 下面的代码块与while循环已经没有任何关系
{
System.out.println("------" + count);
count++;
}

乍一看,这段代码片段没有任何问题,但仔细看一下这个程序,不难发现while循环的循环条件表达式后紧跟了一个分号。在Java程序中,一个单独的分号表示一个空语句,不做任何事情的空语句,这意味着这个while循环的循环体是空语句。空语句作为循环体也不是最大的问题,问题是当Java反复执行这个循环体时,循环条件的返回值没有任何改变,这就成了一个死循环。分号后面的代码块则与while循环没有任何关系。

4.3.2 do while循环语句

do while循环和while循环的区别

do while循环与while循环的区别在于:
while循环是先判断循环条件,如果条件为真则执行循环体;
do while循环则先执行循环体,然后才判断循环条件,如果循环条件为真,则执行下一次循环,否则中止循环。

do while循环的语法格式

do while循环的语法格式如下:

1
2
3
4
5
[初始化语句]
do{
循环体
[迭代语句]
}while (循环条件);

while循环不同的是,do while循环的循环条件后必须有一个分号,这个分号表明循环结束

程序示例 do while循环

下面程序示范了do while循环的用法:

1
2
3
4
5
6
7
8
9
10
// 定义变量count
int count = 1;
// 执行do while循环
do {
System.out.println(count);
// 循环迭代语句
count++;
// 循环条件紧跟while关键字
} while (count < 10);
System.out.println("循环结束!");

do while循环至少执行一次

即使循环条件的值开始就是假,do while循环也会执行循环体。因此,do while循环的循环体至少执行一次。下面的代码片段验证了这个结论:

1
2
3
4
5
6
7
8
// 定义变量count2
int count2 = 20;
// 执行do while循环
do
// 这行代码把循环体和迭代部分合并成了一行代码
System.out.println(count2++);
while (count2 < 10);
System.out.println("循环结束!");

从上面程序来看,虽然开始count2的值就是20,count2<10表达式返回false,但do while循环还是会把循环体执行一次。