if/else 与循环
学习目标
- 掌握
if/else表达式(注意:是表达式不是语句) - 掌握三种循环:
loop、while、for - 理解
break和continue - 掌握循环标签和带值的
break
核心概念
if 表达式
Rust 的 if 是表达式,可以赋值:
fn main() {
let x = 10;
// 基本 if/else
if x > 5 {
println!("大于 5");
} else {
println!("不大于 5");
}
// if 作为表达式赋值
let description = if x > 100 {
"很大"
} else if x > 10 {
"中等"
} else {
"很小"
};
println!("{}", description);
}
注意:条件不需要括号,但花括号是必须的。
loop 无限循环
fn main() {
let mut count = 0;
// 无限循环
loop {
count += 1;
println!("第 {} 次", count);
if count >= 5 {
break; // 退出循环
}
}
// loop 作为表达式,break 可以带值
let result = loop {
count += 1;
if count >= 10 {
break count * 2; // 退出并返回值
}
};
println!("result = {}", result); // 20
}
while 循环
fn main() {
let mut n = 10;
while n > 0 {
println!("{}...", n);
n -= 1;
}
println!("发射!");
}
for 循环(最常用)
fn main() {
// 遍历范围
for i in 0..5 { // 0, 1, 2, 3, 4(不包含 5)
println!("{}", i);
}
for i in 0..=5 { // 0, 1, 2, 3, 4, 5(包含 5)
println!("{}", i);
}
// 遍历数组
let fruits = ["苹果", "香蕉", "橙子"];
for fruit in &fruits {
println!("{}", fruit);
}
// 带索引遍历
for (i, fruit) in fruits.iter().enumerate() {
println!("{}. {}", i + 1, fruit);
}
// 反向遍历
for i in (1..=5).rev() {
println!("{}...", i);
}
}
循环标签(嵌套循环跳出)
fn main() {
'outer: for i in 0..5 {
for j in 0..5 {
if i * j > 6 {
println!("跳出! i={}, j={}", i, j);
break 'outer; // 跳出外层循环
}
}
}
}
continue
fn main() {
for i in 0..10 {
if i % 2 == 0 {
continue; // 跳过本次迭代
}
println!("{}", i); // 只打印奇数
}
}
实践练习
练习 1:FizzBuzz
fn main() {
for i in 1..=30 {
if i % 15 == 0 {
println!("FizzBuzz");
} else if i % 3 == 0 {
println!("Fizz");
} else if i % 5 == 0 {
println!("Buzz");
} else {
println!("{}", i);
}
}
}
练习 2:九九乘法表
fn main() {
for i in 1..=9 {
for j in 1..=i {
print!("{}×{}={:<4}", j, i, i * j);
}
println!();
}
}
练习 3:猜数字游戏
use std::io;
fn main() {
let secret = 42;
let mut attempts = 0;
println!("猜一个 1-100 的数字:");
loop {
let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("读取失败");
let guess: u32 = match guess.trim().parse() {
Ok(n) => n,
Err(_) => {
println!("请输入数字!");
continue;
}
};
attempts += 1;
if guess < secret {
println!("太小了!");
} else if guess > secret {
println!("太大了!");
} else {
println!("🎉 猜对了!用了 {} 次", attempts);
break;
}
}
}
练习 4:打印菱形
fn main() {
let n = 5;
// 上半部分
for i in 0..n {
for _ in 0..(n - i - 1) { print!(" "); }
for _ in 0..(2 * i + 1) { print!("*"); }
println!();
}
// 下半部分
for i in (0..n - 1).rev() {
for _ in 0..(n - i - 1) { print!(" "); }
for _ in 0..(2 * i + 1) { print!("*"); }
println!();
}
}
常见错误
1. if 条件加括号不报错但不推荐
// ⚠️ 可以编译,但不符合 Rust 风格
if (x > 5) { }
// ✅ 推荐
if x > 5 { }
2. if 分支返回类型不一致
// ❌ 两个分支返回不同类型
let x = if true { 5 } else { "hello" };
// ✅ 类型必须一致
let x = if true { 5 } else { 10 };
3. for 范围搞混
for i in 0..5 { } // 0,1,2,3,4(不含 5)
for i in 0..=5 { } // 0,1,2,3,4,5(含 5)
4. 死循环
// ❌ 忘记 break
loop {
println!("停不下来...");
}
// ✅ 有退出条件
loop {
// ... 某个条件下 break
}
小结
| 语法 | 用途 |
|---|---|
if cond { } | 条件分支(表达式) |
loop { } | 无限循环 |
while cond { } | 条件循环 |
for x in iter { } | 迭代循环(最常用) |
break | 退出循环 |
break value | 退出循环并返回值 |
continue | 跳过本次迭代 |
'label: loop | 循环标签 |
0..5 | 范围(不含右端) |
0..=5 | 范围(含右端) |