You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:22:54