5·基础入门入门

if/else 与循环

if/else 与循环

学习目标

  1. 掌握 if/else 表达式(注意:是表达式不是语句)
  2. 掌握三种循环:loopwhilefor
  3. 理解 breakcontinue
  4. 掌握循环标签和带值的 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范围(含右端)

练习编辑器

rust
Loading...