跳转至

循环语句#

循环语句能重复执行相同的语句。

while语句#

while语句用于满足条件时重复执行语句,并在不满足条件时自动退出循环。

while (条件) {
    语句;
    ...
}

以上代码,可以用流程图来表示:

flowchart LR
    start([开始])
    condition{条件}
    statement[语句]
    End([结束])
    start-->condition
    condition--true-->statement-->start
    condition--false-->End

do ... while语句#

do ... while语句和while类似,只是do ... while语句先执行语句、后判断条件。

void main() {
    int i = 2;
    do {
        i++;
    } while (i < 2);
    println(i); // 3

    int j = 2;
    while (j < 2) {
        j++;
    }
    println(j); // 2
}

用流程图表示:

flowchart LR
    start([开始])
    condition{条件}
    statement[语句]
    End([结束])
    start-->statement
    statement-->condition
    condition--true-->start
    condition--false-->End

for语句#

while语句满足以下形式

T v = i;
while (c) {
    s;
    u;
}

时,我们可以用for语句来表示:

for (T v = i; c; u) {
    s;
}

也就是说,for语句允许我们创建1个或几个临时变量作为计数器,并在满足条件c时执行语句s,最后执行更新语句u。其中,创建的临时变量只能在for语句的循环体内使用。

for语句圆括号内的三个语句都可能不存在。

一般地,条件c和更新语句u用于对临时变量操作,例如典型的重复执行n次的循环:

for (int i = 0; i < n; i++) {
    语句;
    ...
}

死循环#

当循环语句的条件始终为true时,该循环就是死循环。

对于for语句,若条件c被省略,则相当于其条件始终为true

while (true) { }
for (;;) { }

死循环在处理不当的情况下会大量占用系统资源,因此循环语句应当在合适的情况下退出。下面我们来看退出、跳过循环的语句。

退出、跳过循环#

break语句负责退出循环。continue语句负责跳过本次循环。

这两个语句都只能对离其最近的循环起作用。若要对外面的循环起作用,则需要使用标签来标记循环语句。

标签#

标签(Label)可用于标记循环语句。

void main() {
    标签名:
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            println(i * 10 + j);
            if (j == 5) {
                continue 标签名;
            }
            if (i == 5) {
                break 标签名;
            }
        }
    }
}

问题:以下代码能否编译?

void main() {
    https://squid233.github.io/java-tutorial/basic/control_flow/loop/
    for (int i = 0; i < 10; i++) {
        println(i);
    }
}
答案

能。上面的代码刻意隐藏了高亮,实际上如果我们把代码高亮显示出来:

void main() {
    https://squid233.github.io/java-tutorial/basic/control_flow/loop/
    for (int i = 0; i < 10; i++) {
        println(i);
    }
}
我们会发现标签名后那一部分代码比较暗,是因为//后面的内容是注释

总结#

一张图总结:

flowchart LR
    start([开始])
    condition{条件}
    statement1[语句1]
    statement2[语句2]
    End([结束])
    start-->condition
    condition--false-->End
    statement1--break-->End
    statement1--continue-->start
    condition--true-->statement1-->statement2-->start
    statement2--break-->End