Rust中赋值给right的变量未被读取警告问题咨询
Rust二分查找中
unused_assignments警告的原因与修复 警告原因分析
你看到的警告不是说之前的right没被读取,而是你赋值给right的新值(middle -1)从来没被使用过。看代码里的分支:
if sorted_array[middle] > target { right = middle - 1; break; // 赋值后直接跳出循环,right的新值根本没机会被读取 }
计算middle时用的是赋值前的right旧值,而你给right赋新值后立刻终止了循环,这个新值在后续代码里完全没被读取(比如下一次循环计算middle、判断left <= right都用不到它),所以Rust触发了这个警告。
什么才算对变量的读取操作?
读取操作指的是使用变量当前存储的数值,常见场景包括:
- 用变量参与计算(比如
let middle = (left + right)/2里对right的读取) - 将变量作为条件判断的一部分(比如
while left <= right里对right的读取) - 将变量作为函数参数传递(比如
println!("{}", right)) - 把变量的值赋给另一个变量(比如
let x = right)
关键是:只有赋值之后的读取,才会被认为这个赋值是有效的。如果赋值后变量再也没被用到,Rust就会判定这个赋值是多余的。
代码修正
你的二分查找逻辑错误在于每次判断后都直接break,导致只执行了一次循环,根本没实现二分查找的迭代过程。正确的做法是去掉非目标分支里的break,让循环持续调整左右边界:
fn main() { let sorted_array: [i32; 10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let target: i32 = 3; let mut left: usize = 0; let mut right: usize = sorted_array.len() - 1; // 改为len()-1,避免索引越界 while left <= right { // 用left + (right - left)/2计算middle,避免left+right溢出usize范围 let middle: usize = left + (right - left) / 2; if sorted_array[middle] == target { println!("Target index {middle}"); return; // 找到目标后直接结束程序 } else if sorted_array[middle] > target { right = middle - 1; // 调整右边界,继续循环查找 } else { left = middle + 1; // 调整左边界,继续循环查找 } } println!("Target not found"); // 处理目标不存在的情况 }
补充说明:
- 初始
right设为sorted_array.len()-1,因为数组索引从0开始,原代码的right=10可能导致后续索引越界; - 用
left + (right - left)/2计算middle是二分查找的标准写法,能避免left+right超出usize的取值范围导致溢出。
内容的提问来源于stack exchange,提问作者Ahmed Radwan
相关产品推荐
相关产品推荐

