Rust 运算符与表达式

Rust 作为表达式语言的运算符、优先级直觉、块表达式与控制流产生值的基础。

#type / concept #status / growing #tech / dev #resource / rust

[!info] 关联笔记

Rust 运算符与表达式

这个概念为什么出现

控制流与函数返回都建立在表达式之上:

  • 算术/比较/逻辑如何组合?
  • 为什么 if 能出现在 let 右边?
  • 短路求值如何影响副作用?
  • 类型不一致的运算为何直接拒绝?

[!abstract] 一句话理解 Rust 里绝大多数“能求值的结构”都是表达式;运算符按类型安全规则组合,逻辑与布尔短路,块与 if/match 也能产生值。

最小可运行示例

场景:运费试算——满额包邮与偏远加价

电商结账要算运费:订单满 100 元(10000 分)包邮;否则基础运费 12 元;偏远地区再加 8 元。
用算术、比较、逻辑与 if 表达式一次算完。

// 业务意图:根据金额与是否偏远计算运费(分)。
// 教学点:比较/逻辑运算符;if 作为表达式赋值。

fn shipping_cents(subtotal_cents: u32, remote: bool) -> u32 {
    let free_shipping = subtotal_cents >= 10_000;
    // if 是表达式,两分支类型必须一致
    let base: u32 = if free_shipping { 0 } else { 1_200 };
    let remote_fee: u32 = if remote { 800 } else { 0 };
    base + remote_fee
}

fn main() {
    let fee = shipping_cents(8_000, true);
    println!("shipping_cents={}", fee);

    // 短路:左侧已能定结果时右侧不求值
    let qty = 0;
    let ok = qty > 0 && (10 / qty > 1); // 不会除零
    println!("ok={}", ok);
}

建议运行:

cargo run

期望输出:

shipping_cents=2000
ok=false

结合场景再看三个关注点

  1. 分支类型一致if 表达式两臂都要能变成同一类型。
  2. 钱用整数再运算,避免浮点运费。
  3. 短路保护无效状态上的昂贵/危险计算。

核心概念与准确模型

常见运算符族

例子说明
算术+ - * / %整数除法截断向零(注意业务)
比较== != < > <= >=产生 bool
逻辑&& || !短路
位运算& | ^ << >>整数位操作
赋值=+=赋值是语句性的用法;复合赋值要求 mut
引用&&mut借用,详见所有权章

表达式思维

let x = 1 + 2 * 3;          // 算术表达式
let y = if x > 5 { 1 } else { 0 }; // 控制流表达式
let z = { let t = y + 1; t };      // 块表达式

类型安全

// let a: i32 = 1;
// let b: u32 = 2;
// let c = a + b; // 错误:类型不一致,需显式转换
let c = 1i32 + 2i32;

显式转换用 as 或更安全的 TryFrom(边界与截断需谨慎)。

边界情况与反直觉行为

  • 整数除法7/2 == 3
  • &&/|| 短路有副作用时要清醒。
  • 没有内建三元 ? ::用 if 表达式。
  • 自定义类型运算符靠 trait(Add 等),属进阶。

常见误区

[!warning] 常见误区:把 if 只当语句 错误理解:if 不能有值。
正确模型:if/match/块都能产生值。
为何易错:从语句主导语言迁来。

工程实践

  1. 复杂条件抽成命名布尔量,提升可读性。
  2. 金额/库存运算明确溢出策略。
  3. 优先表达式风格减少临时可变状态,但不为“炫技”牺牲清晰。

本节总结

  • 运算符在类型安全下组合。
  • 表达式语言使控制流可出现在赋值右侧。
  • 短路与整除等细节有业务影响。

自测题

  1. 为什么 if true { 1 } else { "a" } 不行?
  2. false && panic!() 会不会 panic?
参考答案
  1. 两分支类型不一致。
  2. 不会,因短路不求值右侧。

延伸阅读与资料来源

资料类型支撑内容
The Book — How Functions Work / Comments / Control Flow官方书表达式与控制流
Rust Reference — Operator expressions规范向运算符细节
创建于 2026/7/15 更新于 2026/7/15