跳转到内容

Rust break 和 continue

break 和 continue 让你能提前打断一个循环,而不必每次都把它跑完。它们在三种循环里的用法都一样:loop、while 和 for。

break 会立刻停止循环,程序接着执行循环后面的代码:

fn main() {
for i in 1..=10 {
if i == 5 {
break;
}
println!("{i}");
}
}

输出:

1
2
3
4
▶ 动手试一试

虽然范围一直到 10,但 i 一到 5,循环就停下了。

continue 会跳过本轮剩下的部分,直接进入下一轮,而不是让整个循环停下来:

fn main() {
for i in 1..=10 {
if i % 2 == 0 {
continue; // 跳过偶数
}
println!("{i}");
}
}

输出:

1
3
5
7
9
▶ 动手试一试

每个偶数都被跳过了——continue 一执行,循环就直接拿 i 的下一个值,不会执行 println!。

把一个循环嵌套在另一个循环里时,普通的 break/continue 只对最内层的循环起作用。如果需要在内层循环里跳出外层循环,就给外层循环加一个标签(写成 'name:):

fn main() {
'outer: for x in 1..=3 {
for y in 1..=3 {
if x * y > 4 {
break 'outer;
}
println!("{x} x {y} = {}", x * y);
}
}
}

输出:

1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
2 x 1 = 2
2 x 2 = 4
▶ 动手试一试

如果没有标签,break 只会停止内层的 y 循环,x 还会继续走下去。break 'outer; 则一次把两层都停掉。continue 'outer; 的用法也一样:如果你不想完全停止,而是想直接跳到外层循环的下一轮,就用它。

在 for 循环里,下一个值会自动从范围里取出来,所以 continue 总是安全的。while 循环就不一样了:计数器得由你自己更新,通常写在循环体的最后。如果 continue 跳过了这次更新,计数器就永远不变,循环也就永远停不下来。

下面这段代码想跳过 3,结果却卡住了。不要运行它:

fn main() {
let mut i = 0;
while i < 5 {
if i == 3 {
continue; // ❌ 跳回开头,却没有改变 i
}
println!("{i}");
i += 1;
}
}

当 i 是 3 时,continue 跳回去检查条件。i 还是 3,所以 continue 又执行一次,再一次,永远如此。修复方法是:在任何可能 continue 的代码之前更新计数器:

fn main() {
let mut i = 0;
while i < 5 {
i += 1; // 先更新,这样 continue 就跳不过它
if i == 3 {
continue;
}
println!("{i}");
}
}

输出:

1
2
4
5
▶ 动手试一试

把 i += 1 挪到开头后,数字整体往后移了一位:这个循环打印的是 1 到 5,而不是 0 到 4。如果你需要原来的范围,就调整一下起始值或条件。更好的办法是:如果只是计数,就用 for 循环遍历一个范围,这个问题根本不会出现。

打印 1 到 10,但跳过所有 3 的倍数。提示:当 n % 3 == 0 时,这个数就是 3 的倍数。用 continue 跳过它。

查看答案
fn main() {
for n in 1..=10 {
if n % 3 == 0 {
continue;
}
println!("{n}");
}
}

输出:

1
2
4
5
7
8
10
▶ 动手试一试

用两个嵌套的 for 循环 x 和 y,都遍历 1..=9。找出第一对满足 x * y == 24 的数,打印出来,然后同时停止两个循环。提示:给外层循环加一个标签,然后用 break 'outer;。

查看答案
fn main() {
'outer: for x in 1..=9 {
for y in 1..=9 {
if x * y == 24 {
println!("找到了:{x} x {y} = 24");
break 'outer;
}
}
}
println!("搜索结束");
}

输出:

找到了:3 x 8 = 24
搜索结束
▶ 动手试一试

试着把 break 'outer; 改成普通的 break;。这样只有内层循环会停下,搜索还会继续,于是还会打印出 4 x 6、6 x 4 和 8 x 3。

  • break 立刻退出循环。
  • continue 跳过本轮剩下的部分,进入下一轮。
  • 标签('outer:)让 break/continue 能在内层循环里控制外层循环。
  • 在 while 循环里,要在任何 continue 之前更新计数器,否则循环可能永远卡住。

小测验

1. continue 在循环里做什么?

2. 要让 break 能在嵌套循环里指定外层循环,标签该怎么写?

3. 一个带 continue 的 while 循环永远不结束。最可能的原因是什么?

得分: 0 / 3