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 | [初始化语句] |
while
循环每次执行循环体之前,先对循环条件求值,如果循环条件为true
,则运行循环体部分。从上面的语法格式来看,迭代语句总是位于循环体的最后,因此只有当循环体能成功执行完成时,while
循环才会执行迭代语句.
从这个意义上来看,while
循环也可被当成条件语句:如果循环条件一开始就为false
,则循环体部分将永远不会获得执行。
程序示例 简单的while循环
下面程序示范了一个简单的while
循环。
1 | // 循环的初始化条件 |
如果while
循环的循环体部分和迭代语句合并在一起,且只有一行代码,则可以省略while
循环后的花括号。但这种省略花括号的做法,可能降低程序的可读性
如果省略了循环体的花括号,那么while
循环条件仅控制到紧跟该循环条件的第一个分号处。
死循环
使用while
循环时,一定要保证循环条件有变成false
的时候,否则这个循环将成为一个死循环,永远无法结束这个循环。
例如如下代码:
1 | // 下面是一个死循环 |
在上面代码中,count
的值越来越小,这将导致count
值永远小于10,使得循环条件count<10
一直为true
,从而导致这个循环永远无法结束。
循环条件后面不要加分号
除此之外,对于许多初学者而言,使用while
循环时还有一个陷阱:while
循环的循环条件后紧跟个分号。比如有如下程序片段:
1 | int count = 0; |
乍一看,这段代码片段没有任何问题,但仔细看一下这个程序,不难发现while
循环的循环条件表达式后紧跟了一个分号。在Java
程序中,一个单独的分号表示一个空语句,不做任何事情的空语句,这意味着这个while
循环的循环体是空语句。空语句作为循环体也不是最大的问题,问题是当Java
反复执行这个循环体时,循环条件的返回值没有任何改变,这就成了一个死循环。分号后面的代码块则与while
循环没有任何关系。
4.3.2 do while循环语句
do while循环和while循环的区别
do while
循环与while
循环的区别在于:while
循环是先判断循环条件,如果条件为真则执行循环体;do while
循环则先执行循环体,然后才判断循环条件,如果循环条件为真,则执行下一次循环,否则中止循环。
do while
循环的语法格式
do while
循环的语法格式如下:
1 | [初始化语句] |
与while
循环不同的是,do while
循环的循环条件后必须有一个分号,这个分号表明循环结束。
程序示例 do while循环
下面程序示范了do while
循环的用法:
1 | // 定义变量count |
do while循环至少执行一次
即使循环条件的值开始就是假,do while
循环也会执行循环体。因此,do while
循环的循环体至少执行一次。下面的代码片段验证了这个结论:
1 | // 定义变量count2 |
从上面程序来看,虽然开始count2
的值就是20,count2<10
表达式返回false
,但do while
循环还是会把循环体执行一次。