循环语句(上篇)

我们编写代码的主要目的就是让电脑以“电”的方式来帮助我们做事情,尤其是在做有大量重复的事情的时候,比如每一次都准确无误地从一数到一百,或者是设置一个定时。这就自然涉及到本节教程的主题–循环。

在Java中支持两种循环语句,while循环和for循环。后面教程在没有特别指明的时候,循环和循环语句这两种称谓往往指代同一个意思。

while循环语句的基本语法结构如下,

while (循环条件) {
    ...
}

接下来仍然通过代码示例来帮助大家更好地理解while循环的用法。

假设现在需要一个程序让电脑从一数到一百,可以这样编写代码,

int counter = 1;
while (counter <= 100) {
    System.out.println(counter);
    counter++;
}

首先我们创建一个int型的“计数器”变量counter,并赋予初始值1。然后是while循环代码部分,在循环条件中我们判断变量counter是否小于等于100。此刻条件显然满足,因此程序会进入代码块里面,打印变量couter的当前值(这里是1),然后自增1一个单位。

然后程序继续回到while循环的循环条件部分,现在counter的值变成了2,循环条件仍然满足,因此程序会再一次执行代码块。

现在计数器变量counter的值变成了3,循环条件还是满足,程序继续执行while语句的代码块部分。这个类似的过程会重复执行,直到最后一次自增运算(counter++)将变量counter的值更新为101。当程序再次回到循环条件部分(counter <= 100),发现其不成立,于是不再继续执行while语句的代码块。

如果大家运行上面这段代码,屏幕上会打印

1
2
3
4
...
...
99
100

与前面学习的if语句一样,while循环语句也可以内嵌,而且while语句也可以嵌入到if语句里面,if语句也可以嵌入到while语句里面。下面我们一起看一个综合性的例子。

int minutes = 0;
while (minutes < 60) {
    int seconds = 0;
    while (seconds < 60) {
        if (minutes < 10) {
            System.out.print("0");
        }
        System.out.print(minutes);
        System.out.print(":");
        if (seconds < 10) {
            System.out.print("0");
        }
        System.out.println(seconds);
        seconds++;
    }
    minutes++;
}

上面这段代码模拟了一个定时器,会从00:00计时到59:59。第一行代码声明了一个int型变量minutes,用来表示分钟,接着从第二行到第十七行是最外层while语句。

while (minutes < 60) {
    ...
    minutes++;
}

最外层while语句的核心结构如上,省略号代表的是前面第三行到第十五行的所有代码。程序每次进入代码块里面,它会执行前面(省略号表示的)的所有语句,然后将变量minutes自增一个单位。在Java编程术语中,像变量minutes这样的往往叫做循环控制变量,或者循环变量。这里这个循环变量的作用是保证最外层while循环执行60次(从0到59)。

接下来我们一起重点地看看省略号表示的那部分代码。

int seconds = 0;
while (seconds < 60) {
    if (minutes < 10) {
        System.out.print("0");
    }
    System.out.print(minutes);
    System.out.print(":");
    if (seconds < 10) {
        System.out.print("0");
    }
    System.out.println(seconds);
    seconds++;
}

同理,这里我们也先声明一个int型变量seconds,用来表示秒钟。这里的用法大家之前都没有看见过–在代码块里面声明一个其他变量。在代码块里面声明其他变量,这在Java中是被支持的、合法的。大家可以类比我们目前为止都是在main()方法的代码块里面声明的变量。

接下来是内层第二个while语句,它的核心结构与最外层while语句一样。

while (seconds < 60) {
    ...
    seconds++;
}

每次程序进入这里的代码后,会先执行一些打印语句,然后将循环变量seconds自增1。内层while语句的代码块部分体现出了两种有趣的用法,一是while语句内层嵌入了if语句,而是在内层while语句里面我们可以直接使用变量minutes,尽管这个变量是在最外层while语句外面声明的。

在以“分钟:秒钟”这个基本格式打印时间时,程序先判断分钟minutes是否小于10,若小于则先打印一个“0”来对齐两个数字宽度。同理,在打印秒钟部分也先判断seconds是否小于10,如果小于10也先打印0来对齐。

如果大家运行一下这段完整代码,屏幕上就开始计时了,

00:00
00:01
00:02
00:03
00:04
...
...
59:57
59:58
59:59

现在我们理解了while循环语句的用法,接下来继续看看另外一种while循环语句。do-while循环语句的基本语法结构如下,

do {
    ...
} while (循环条件);

与while语句最大的不同就是,程序在执行do-while语句时至少会进入一次循环代码块。在编程术语中,循环代码块也常常被叫做循环体,“Loop Body”。

以下面这段代码为例,

counter = 11;
do {
    System.out.println(counter);
    counter++;
} while (counter <= 10);

尽管当变量counter的值为11时,整个do-while语句的循环条件不成立,但是由于程序会先进入单词do后面的代码块,然后再判断循环条件是否成立。因此我们运行这段代码,屏幕上会打印

11

而不是什么也不输出。

需要特别注意的是,我们在编写完do-while语句的循环条件的这部分代码后,末尾还要添加一个分号”;”,这是与while语句的第二个最大不同。

同样地,在do-while语句里面也可以嵌入其他条件语句甚至while循环语句。

让我们一起来用do-while语句改写前面的计时器,

minutes = 0;
do {
    int seconds = 0;
    do {
        if (minutes < 10) {
            System.out.print("0");
        }
        System.out.print(minutes);
        System.out.print(":");
        if (seconds < 10) {
            System.out.print("0");
        }
        System.out.println(seconds);
        seconds++;
    } while (seconds < 60);
    minutes++;
} while (minutes < 60);

对于最外层do-while语句,它的核心结构如下,

do {
    ...
    minutes++;
} while (minutes < 60);

省略号表示的是前面代码中第三行到第十五行部分。程序在执行这段代码时,会先执行关键词do后面的代码块,接着判断循环条件(minutes < 60)是否仍然成立。第一次执行完循环代码块后,变量minutes的值变成了1,循环条件仍然成立,程序继续执行代码块。

最外层do-while语句会一直执行,直到最后一次执行完循环体后变量minutes变成了60,循环条件不再成立。

对于内层do-while语句,它的核心结构也类似,

do {
    ...
    seconds++;
} while (seconds < 60);

以上就是while循环语句和do-while循环语句的基本用法。这里仍然贴上本节教程的完整代码,

public class LoopsDemo {
    public static void main(String[] args) {
        int counter = 1;
        while (counter <= 100) {
            System.out.println(counter);
            counter++;
        }

        int minutes = 0;
        while (minutes < 60) {
            int seconds = 0;
            while (seconds < 60) {
                if (minutes < 10) {
                    System.out.print("0");
                }
                System.out.print(minutes);
                System.out.print(":");
                if (seconds < 10) {
                    System.out.print("0");
                }
                System.out.println(seconds);
                seconds++;
            }
            minutes++;
        }

        counter = 11;
        do {
            System.out.println(counter);
            counter++;
        } while (counter <= 10);

        minutes = 0;
        do {
            int seconds = 0;
            do {
                if (minutes < 10) {
                    System.out.print("0");
                }
                System.out.print(minutes);
                System.out.print(":");
                if (seconds < 10) {
                    System.out.print("0");
                }
                System.out.println(seconds);
                seconds++;
            } while (seconds < 60);
            minutes++;
        } while (minutes < 60);
    }
}

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注