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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:21:19