做决策:条件与循环

原理

if 在 Rust 中是表达式(expression),每个分支必须有相同类型。编译期确认所有分支类型一致,生成单一返回值的 LLVM Phi 节点。

for .. in 基于 IntoIterator trait 进行迭代。编译器对范围 0..5 进行循环展开(loop unrolling)优化,消除边界检查。loop 在 LLVM 中生成无条件分支(br label),while 在每次迭代前执行条件分支。

break 可携带返回值:break value;,这使得 loop 成为常规表达式的替代方案。continue 生成无条件跳回循环头的分支。

C: 条件与循环


语法

if/else

let score = 85;
let grade = if score >= 90 { "A" }
    else if score >= 75 { "B" }
    else if score >= 60 { "C" }
    else { "F" };
// grade 是 &str 类型,各分支统一

比较运算符:== != > < >= <=

逻辑运算符:

符号含义示例
&&a > 0 && b > 0
||x == 1 || x == 2
!!done

if 条件必须是 bool 类型。if 1 {} 是编译错误(区别于 C)。

循环

// loop — 无限循环
let mut count = 0;
let result = loop {
    count += 1;
    if count >= 10 { break count * 2; }
};
 
// while — 带条件
let mut n = 5;
while n > 0 {
    n -= 1;
}
 
// for — 迭代遍历
for i in 0..5 { }      // 0,1,2,3,4
for i in 0..=5 { }     // 0,1,2,3,4,5
for (i, v) in arr.iter().enumerate() { }
for v in arr { }        // 消耗所有权
for v in &arr { }       // 借用
for v in (1..5).rev() { // 逆序

break / continue

for i in 1..=10 {
    if i == 5 { break; }      // 立即退出循环
    if i % 2 == 0 { continue; } // 跳过本次迭代
}
关键字行为
break退出循环(可带值)
continue跳过本次剩余代码,继续下一次

实践

力扣问题

力扣: 力扣简单循环模拟题

fn main() {
    let target: f64 = read_one();
    let mut dist = 0.0;
    let mut step = 2.0;
    let mut count = 0;
    while dist < target {
        dist += step;
        step *= 0.98;
        count += 1;
    }
    println!("{}", count);
}

力扣: 力扣简单数组题

AI 自检

  1. if 为什么必须是表达式?从编译器 SSA 生成的角度说明。
  2. for v in vecfor v in &vec 的区别是什么?所有权如何变化?