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
相关产品推荐
相关产品推荐

