九、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 循环之后的代码。

while 循环语句执行流程图.jpg例 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);
    }
}

在上述代码中,定义了两个变量 sumn,循环每执行一次 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,如果循环条件满足,循环继续执行,否则退出循环。

do-while 循环语句的执行流程.jpg我们把对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 这个循环条件表达式的值也就永远是 truesum += 1 这个循环将永远执行下去。这种死循环,会严重抢占计算机的算力,导致程序和计算机运行卡顿或崩溃。

但有时,死循环是程序员故意引入的,是程序运行所依赖的。就拿大家的电脑来说,你所看到的每一个窗口,都是一个巨大的死循环,它们每隔一段极小的时间,就在屏幕上渲染一次最新的画面,并查询一次用户通过鼠标、键盘、触屏等输入设备的输入,并进行处理,正因如此,我们才能通过图形用户界面与程序进行交互,这个极小的时间,就是程序的帧率,整个死循环,在程序被关闭时才会停止。

一般来说,程序员故意写的死循环,循环条件表达式会直接写 true