做决策:条件与循环
原理
if 在 Rust 中是表达式(expression),每个分支必须有相同类型。编译期确认所有分支类型一致,生成单一返回值的 LLVM Phi 节点。
for .. in 基于 IntoIterator trait 进行迭代。编译器对范围 0..5 进行循环展开(loop unrolling)优化,消除边界检查。loop 在 LLVM 中生成无条件分支(br label),while 在每次迭代前执行条件分支。
break 可携带返回值:break value;,这使得 loop 成为常规表达式的替代方案。continue 生成无条件跳回循环头的分支。
语法
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 自检
if为什么必须是表达式?从编译器 SSA 生成的角度说明。for v in vec与for v in &vec的区别是什么?所有权如何变化?