Skip to content

条件表达式

> 学习 if/else 表达式语法,理解 Rust 中条件语句是表达式(可以返回值)的特殊设计。

为什么需要控制流?

没有控制流的程序

顺序执行:
┌─────────────────┐
│ 第 1 行代码       │
│ ↓               │
│ 第 2 行代码       │
│ ↓               │
│ 第 3 行代码       │
│ ↓               │
│ ...             │
│ ↓               │
│ 第 1000 行代码    │
└─────────────────┘

问题:无法根据条件做不同事情,无法重复执行

有控制流的程序

条件分支:
              ┌───────────────┐
              │   if 条件?    │
              └───────┬───────┘

         ┌───────────┴───────────┐
         │ YES                   │ NO
         ↓                       ↓
    ┌─────────┐            ┌─────────┐
    │ 执行 A   │            │ 执行 B   │
    └─────────┘            └─────────┘

循环重复:
              ┌───────────────┐
         ┌───│  条件满足?    │
         │   └───────┬───────┘
         │           │ YES
         │           ↓
         │      ┌─────────┐
         │      │ 执行代码 │
         │      └─────────┘
         │           │
         └───────────┘

if 表达式

基本语法

rust
fn main() {
    let number = 7;

    if number < 5 {
        println!("小于 5");
    } else if number < 10 {
        println!("在 5 到 10 之间");
    } else {
        println!("大于等于 10");
    }
}
▶ Run

if 是表达式(可以返回值)

这是 Rust 与其他语言的重要区别:

rust
fn main() {
    let number = 7;

    // if 可以返回值,赋值给变量
    let description = if number < 5 {
        "small"      // 没有分号,是表达式
    } else if number < 10 {
        "medium"
    } else {
        "large"
    };

    println!("数字是 {}", description);  // medium

    // 可以直接在 println! 中使用
    println!("数字是 {}", if number > 5 { "大" } else { "小" });
}
▶ Run

重要规则:分支类型必须一致

rust
fn main() {
    // ✅ 正确:所有分支返回相同类型
    let result = if true {
        5
    } else {
        10
    };
    println!("result = {}", result);  // i32

    // ❌ 错误:分支类型不一致
    // let result = if true {
    //     5           // i32
    // } else {
    //     "five"      // &str
    // };

    // ✅ 正确:使用 () 统一类型
    let result = if true {
        println!("执行了");
        // 隐式返回 ()
    } else {
        5
        // 这里会报错,因为 () != i32
    };
}
▶ Run

条件必须是布尔类型

rust
fn main() {
    let number = 7;

    // ✅ 正确:条件是布尔表达式
    if number > 0 {
        println!("正数");
    }

    // ❌ 错误:Rust 没有"真值转换"
    // if number {
    //     println!("真");
    // }

    // C/JavaScript/Python 中,非零值被认为是 true
    // Rust 要求明确的布尔条件

    // ✅ 正确写法
    if number != 0 {
        println!("非零");
    }
}
▶ Run

错误信息:

error[E0308]: mismatched types
 --> src/main.rs:5:8
  |
5 |     if number {
  |        ^^^^^^ expected `bool`, found integer

复杂条件

rust
fn main() {
    let age = 25;
    let has_id = true;
    let has_ticket = true;

    // 逻辑与 (&&) - 短路求值
    if age >= 18 && has_id {
        println!("可以进入(成年且有身份证)");
    }

    // 逻辑或 (||) - 短路求值
    if has_id || has_ticket {
        println!("有身份证或门票,可以进入");
    }

    // 组合条件
    if age >= 18 && (has_id || has_ticket) {
        println!("成年人,且有身份证或门票");
    }

    // 短路求值演示
    let result = false && {
        println!("这行不会打印(因为左边是 false)");
        true
    };

    let result = true || {
        println!("这行也不会打印(因为左边是 true)");
        true
    };
}
▶ Run

小结

  • if 在 Rust 中是表达式,可以返回值赋给变量
  • 条件必须是 bool 类型,不能是整数(不像 C/C++)
  • if/else if/else 各分支返回类型必须一致
  • if let 简化单分支 Option/Result 判断

练习题

详见:练习题