C++温度转换代码传入Fahrenheit参数始终走else分支问题排查
问题分析
程序始终进入else分支的核心原因是类构造函数的赋值方向写反了。
原构造函数代码:
Temperature(int atemp, string aunit) { atemp = temp; aunit = unit; }
C++中赋值运算符=的逻辑是将右侧表达式的值赋给左侧变量,上述代码实际上是把未初始化的类成员temp、unit的内存垃圾值,赋值给了构造函数的临时形参atemp、aunit。形参会在构造函数执行结束后直接销毁,类的两个成员变量自始至终都没有被传入的参数赋值,存储的是随机无效值,自然无法匹配"Fahrenheit"、"Celsius"两个判断条件,永远走到else分支。
除此之外原代码还有两个隐性问题:
- 温度转换的公式和单位对应关系写反:摄氏度转华氏度的公式为
(摄氏度数值 * 1.8) + 32,华氏度转摄氏度的公式为(华氏度数值 - 32) * 5 / 9,原代码两个分支的公式和判断条件完全错位,即使修好构造函数,输出的转换结果也是错误的。 - 没有显式引入
<string>头文件,std::string的定义实际来自<string>头文件,部分编译器下依赖iostream的间接引入会出现编译报错。
修复后代码
#include <iostream> #include <string> using namespace std; class Temperature { public: int temp; string unit; // 修正赋值方向,也可以改用初始化列表写法避免赋值方向错误:Temperature(int atemp, string aunit) : temp(atemp), unit(aunit) {} Temperature(int atemp, string aunit) { temp = atemp; unit = aunit; } void to_fahrenheit() { if (unit == "Celsius") { cout << ((temp*1.8) + 32) << " Fahrenheit"; } else if (unit == "Fahrenheit") { cout << ((temp-32)*5/9) << " Celsius"; } else { cout << "Converts only Fahrenheit to Celsius or vice versa."; } } }; int main() { Temperature temp1 (10,"Fahrenheit"); temp1.to_fahrenheit(); return 0; }
运行上述修复后的代码,传入10、"Fahrenheit"参数时会正确输出-12 Celsius的转换结果。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

