Rust break 和 continue
break 和 continue 让你能提前打断一个循环,而不必每次都把它跑完。它们在三种循环里的用法都一样:loop、while 和 for。
break:直接退出循环
Section titled “break:直接退出循环”break 会立刻停止循环,程序接着执行循环后面的代码:
fn main() { for i in 1..=10 { if i == 5 { break; } println!("{i}"); }}输出:
1234虽然范围一直到 10,但 i 一到 5,循环就停下了。
continue:跳到下一轮
Section titled “continue:跳到下一轮”continue 会跳过本轮剩下的部分,直接进入下一轮,而不是让整个循环停下来:
fn main() { for i in 1..=10 { if i % 2 == 0 { continue; // 跳过偶数 } println!("{i}"); }}输出:
13579每个偶数都被跳过了——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 = 11 x 2 = 21 x 3 = 32 x 1 = 22 x 2 = 4如果没有标签,break 只会停止内层的 y 循环,x 还会继续走下去。break 'outer; 则一次把两层都停掉。continue 'outer; 的用法也一样:如果你不想完全停止,而是想直接跳到外层循环的下一轮,就用它。
while 循环里的 continue 陷阱
Section titled “while 循环里的 continue 陷阱”在 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}"); }}输出:
1245把 i += 1 挪到开头后,数字整体往后移了一位:这个循环打印的是 1 到 5,而不是 0 到 4。如果你需要原来的范围,就调整一下起始值或条件。更好的办法是:如果只是计数,就用 for 循环遍历一个范围,这个问题根本不会出现。
1. 跳过 3 的倍数
Section titled “1. 跳过 3 的倍数”打印 1 到 10,但跳过所有 3 的倍数。提示:当 n % 3 == 0 时,这个数就是 3 的倍数。用 continue 跳过它。
2. 找出乘积为 24 的一对数
Section titled “2. 找出乘积为 24 的一对数”用两个嵌套的 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
- 循环标签:在多个循环之间消除歧义——《Rust 程序设计语言》:官方对循环标签的入门介绍,附一个嵌套倒计时的例子。
- 嵌套循环和标签——《通过例子学 Rust》:一个简短的可运行示例,演示
break 'outer和continue 'outer。 - Loop Labels — The Rust Reference(英文):标签可以用在哪里的准确规则。
breakexpressions — The Rust Reference(英文):break的工作方式,包括带值的break。continueexpressions — The Rust Reference(英文):continue在各种循环里分别做什么。