巢狀迴圈
本集目標
把迴圈放進迴圈裡——用巢狀迴圈印出九九乘法表。
正文
上一集學了 for 迴圈,今天來玩個進階的——把一個迴圈放進另一個迴圈裡面。
什麼是巢狀迴圈?
「巢狀」就是「一層包一層」的意思,像俄羅斯套娃一樣。外面的迴圈跑一次,裡面的迴圈就會完整跑完一輪。
九九乘法表
來挑戰一下,用巢狀迴圈印出九九乘法表:
fn main() {
for i in 1..=9 {
for j in 1..=9 {
print!("{} x {} = {} ", i, j, i * j);
}
println!(); // 換行
}
}
它是怎麼運作的?
- 外面的迴圈
i從 1 跑到 9 - 當
i = 1時,裡面的迴圈j從 1 跑到 9 → 印出 1×1, 1×2, … 1×9 - 裡面的迴圈跑完後,
println!()換行 - 外面的迴圈走到
i = 2,裡面的迴圈又從 1 跑到 9 → 印出 2×1, 2×2, … 2×9 - 以此類推……
print! vs println!
這裡用了一個新東西:print!。它跟 println! 很像,差別在於 print! 印完不會換行,而 println! 印完會換行。
視覺化
外迴圈跑一次 = 一行:
i=1 → [j=1, j=2, j=3, ... j=9] → 換行
i=2 → [j=1, j=2, j=3, ... j=9] → 換行
...
i=9 → [j=1, j=2, j=3, ... j=9] → 換行
break 只跳出最內層
在巢狀迴圈裡用 break,它只會跳出最裡面那一層迴圈,外面那層還會繼續跑:
fn main() {
for i in 1..=3 {
for j in 1..=3 {
if j == 2 {
break; // 只跳出內層迴圈
}
println!("i={}, j={}", i, j);
}
}
}
每次 j 到 2 就 break 了,但外層的 i 還是繼續跑 1、2、3。
loop label:跳出指定層
如果你想直接跳出外面那層呢?可以用 loop label:
fn main() {
'outer: for i in 1..=3 {
for j in 1..=3 {
if j == 2 {
break 'outer; // 跳出外層迴圈
}
println!("i={}, j={}", i, j);
}
}
println!("結束!");
}
'outer: 是一個標籤(label),放在迴圈前面。break 'outer 就是說「跳出標記為 'outer 的那個迴圈」。注意標籤名稱前面要加 '(單引號)。
重點整理
- 巢狀迴圈就是迴圈裡面再放迴圈,外層跑一次、內層就完整跑一輪
print!和println!的差別:print!印完不換行break在巢狀迴圈裡只會跳出最內層的迴圈- 用 loop label(
'outer:+break 'outer)可以跳出指定的外層迴圈