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

Rust代码中条件判断始终不满足的原因排查

Rust温度转换程序input_num值异常问题分析

问题根源是变量遮蔽(Variable Shadowing):

  • 在main函数开头你声明了let input_num: u32 = 0;,但在loop内部又用let input_num: u32 = ...重新声明了同名变量。这个内部变量只在当前代码块(loop的单次迭代)内有效,和外层的input_num是完全独立的两个变量。
  • 当loop结束后,你在if判断中使用的是外层那个初始值为0的input_num,而非用户输入的数值,所以第一个条件input_num == 1永远无法满足。

修复方案

把外层的input_num改为可变变量,去掉loop内部的let,直接给外层变量赋值:

use std::io;

fn show_options() {
    println!("You want to convert to:");
    println!("\t1. Celsius");
    println!("\t2. Fahrenheit");
    println!("Type your option number:");
}

fn print_invalid() {
    println!("Invalid option. Choose 1 or 2:\n")
}

fn main() {
    let mut result; // 改为mut,因为后续需要赋值
    let mut input = String::new();
    let mut temp = String::new();
    let mut input_num: u32 = 0; // 声明为可变变量
    
    loop {
        input.clear();
        show_options();
        
        io::stdin()
            .read_line(&mut input)
            .expect("Failed to read line");
        
        // 去掉let,直接给外层input_num赋值
        input_num = input.trim().parse().unwrap();
        match input_num {
            1 => break,
            2 => break,
            _ => {
                print_invalid();
                continue;
            },
        };
    };

    println!("What's the temperature?");
    
    io::stdin()
        .read_line(&mut temp)
        .expect("Failed to read line");

    let temp_num: f32 = temp.trim().parse().unwrap();

    // 华氏转摄氏:修正公式为除以1.8(原代码是乘法,结果错误)
    if input_num == 1 {
        result = (temp_num - 32.0) / 1.8;
        print!("The {temp_num}°F is {result:.2}°C"); // 保留两位小数更友好
    // 摄氏转华氏
    } else {
        result = (temp_num * 1.8) + 32.0;
        print!("The {temp_num}°C is {result:.2}°F");
    };
}

额外提示:原代码中华氏转摄氏的公式有误,正确公式是(F-32)/1.8,已在修复代码中修正,同时添加了.2格式化输出保留两位小数,提升可读性。

内容的提问来源于stack exchange,提问作者Kemel Zaidan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:55:55