九、Java 的流程控制语句(while 循环)
1 为什么需要循环结构
让我们思考一个问题:编程求 1~100 的和。
现在的我们可以想到什么解决办法呢?是不辞辛劳地写 sum = 1 + 2 + … + 100;
,还是想到了可以计算 sum = 101 * 50;
呢?
很显然,第二种方式更便于我们写代码,但这需要我们在编程前,对问题进行严谨的分析,这个问题还比较简单,我们不能保证每个问题,我们都可以找到方便的计算方法,甚至可以说,能找到便捷算法的问题才是少数。
对于计算机来说,它的计算能力是极强的,它适合做一些机械的复杂的计算工作,这两种计算方式,虽然第二种会快一些,但差距甚至不会超过半秒,所以,除非极其看重运行速度,否则,我们没有必要帮计算机想怎样计算更快。
那么,我们怎样才能更方便地把 sum = 1 + 2 + … + 100;
写在代码当中呢?
这就需要用到 “循环结构” 。所有流行的编程语言中都有循环语句。循环是程序中的重要流程结构之一。循环语句能够使程序代码重复执行,适用于需要重复一段代码直到满足特定条件为止的情况。
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。
2 while 语句
while
语句是 Java 最基本的循环语句,是一种先判断的循环结构,可以在一定条件下重复执行一段代码。该语句需要判断一个测试条件,如果该条件为真,则执行循环语句(循环语句可以是一条或多条),否则跳出循环。
while
循环语句的语法结构如下:
while(条件表达式) {
语句块;
}
其中语句块中的代码可以是一条或者多条语句,而条件表达式是一个有效的 boolean
表达式,它决定了是否执行循环体。当条件表达式的值为 true
时,就执行大括号中的语句块。
执行完毕,再次检查表达式是否为 true
,如果还为 true
,则再次执行大括号中的代码,否则就跳出循环,执行 while
循环之后的代码。
例 1
求 1~100 的和,其具体代码如下所示。
public class Hello {
public static void main(String[] args) {
int n = 1;
int sum = 0;
while (n <= 100){
sum += n;
n++;
}
System.out.println("1~100 的和:" + sum);
}
}
在上述代码中,定义了两个变量 sum
和 n
,循环每执行一次 n
值就加 1,判断 n
的值是否小于等于 100,并利用 sum += n;
语句来实现累加。当 n
的值大于 100 之后,循环便不再执行并退出循环。
输出:1~100 的和:5050
3 do-while 语句
如果 while
循环一开始条件表达式就是假的,那么循环体就根本不被执行。然而,有时需要在开始时条件表达式即使是假的情况下,while
循环至少也要执行一次。换句话说,有时你需要在一次循环结束后再测试中止表达式,而不是在循环开始时。
幸运的是,Java 就提供了这样的循环:do-while
循环。do-while
循环语句的特点是先执行循环体,然后判断循环条件是否成立。
do-while 语句的语法格式如下:(while 语句后必须以分号表示循环结束)
do {
语句块;
}while(条件表达式);
以上语句的执行过程是,首先执行一次循环操作,然后再判断 while 后面的条件表达式是否为 true,如果循环条件满足,循环继续执行,否则退出循环。
我们把对1到100的求和用do while循环改写一下:
public class Main {
public static void main(String[] args) {
int sum = 0;
int n = 1;
do {
sum = sum + n;
n ++;
} while (n <= 100);
System.out.println(sum);
}
}
4 比较 while 与 do-while
do-while
循环先执行循环,再判断条件;循环会至少执行一次。
while
循环先判断条件,再执行循环;如果一开始循环条件就不满足,则不会执行循环。
do-while
循环最适合的必须执行一次循环的情境,相对来说较少;而且代码编写起来,也不如 while
循环简单,所以,还是 while
循环用得更多。
5 死循环
如果一个循环结构的循环条件表达式的值,永远不会变成 false ,循环就会一直进行下去,这被称为 “死循环” 。
大部分死循环是 Bug ,比如,在上面的例子中,我们写代码时,遗漏了 n++;
,那么 n
永远都是 1 ,永远不会大于 100 ,n <= 100
这个循环条件表达式的值也就永远是 true
,sum += 1
这个循环将永远执行下去。这种死循环,会严重抢占计算机的算力,导致程序和计算机运行卡顿或崩溃。
但有时,死循环是程序员故意引入的,是程序运行所依赖的。就拿大家的电脑来说,你所看到的每一个窗口,都是一个巨大的死循环,它们每隔一段极小的时间,就在屏幕上渲染一次最新的画面,并查询一次用户通过鼠标、键盘、触屏等输入设备的输入,并进行处理,正因如此,我们才能通过图形用户界面与程序进行交互,这个极小的时间,就是程序的帧率,整个死循环,在程序被关闭时才会停止。
一般来说,程序员故意写的死循环,循环条件表达式会直接写 true
。