功能返回奇怪的东西

时间:2016-05-06 19:39:53

标签: c++ return

我有一个功能可以从成绩对象中获取成绩点值,并将其作为双倍返回,如下所示:

double Grade::getNumGrade()
{
    double value;

    if (strGrade == "A")
    {
        return 4.0;
    }
    else if (strGrade == "A-")
    {
        return 3.7;
    }
    else if (strGrade == "B+")
    {
        return 3.3;
    }
    else if (strGrade == "B")
    {
        return 3.0;
    }
    else if (strGrade == "B-")
    {
        return 2.7;
    }
    else if (strGrade == "C+")
    {
        return 2.3;
    }
    else if (strGrade == "C")
    {
        return 2.0;
    }
    else if (strGrade == "C-")
    {
        return 1.7;
    }
    else if (strGrade == "D+")
    {
        return 1.3;
    }
    else if (strGrade == "D")
    {
        return 1.0;
    }
    else if (strGrade == "D-")
    {
        return  0.7;
    }
    else if (strGrade == "F")
    {
        return 0.0;
    }
}

strGrade是成绩的字符串表示。但是这里有代码:

Grade jon = Grade("A+");

cout << jon.getNumGrade();

输出:

  

-1。#IND

构造函数只是确保第一个字母是大写,然后保存提供为strGrade的字符串。不确定为什么会发生这种情况或如何解决它?

2 个答案:

答案 0 :(得分:1)

正如NathanOliver指出的那样,

  

你永远不会在你的if语句中处理A +。

double value;
if (strGrade == "A")
{
    return 4.0;
}
else if (strGrade == "A-")
{
    return 3.7;
}

strGrade == A+.

时没有条件

但是,由于评论中已经回答了这个问题,我会尝试通过给你一些建议来证明这是一个答案。

你最后的条件,

else if (strGrade == "F")
{
    return 0.0;
}

不应该是else if。有很多很好的方法来处理错误处理(比如一个意外的输入),但是一个非常简单而有效的练习就是用else来结束你的条件。例如,

//if all other conditionals thus far have returned false
else
{
    ... error handling here ...
}

如果您属于此else,请记录错误和/或正常退出程序;至少,返回一个值并适当地处理它。

另外,请考虑根据某个条件被评估的可能性if else,将您的true应用于逻辑排序。更具体地说,如果您知道大多数学生将获得B +,那么将其作为第一个在if else系列中评估的表达式。如果B-是下一个最常见的等级,那么将其作为第二个被评估的表达式;等等。此外,如果您知道某个成绩最不可能通过,请将 last 条件设为您检查。

答案 1 :(得分:1)

  

不确定为什么会发生这种情况或如何解决?

这种情况正在发生,因为您的函数没有为"A+"情况返回值并暴露未定义的行为。

正如评论中所提到的,你应该看到编译器警告说明

  
Not all of your code paths return a value.
  

您可以修复在函数的最后一个大括号之前始终提供(合理的)返回值,或者为strGrade的意外情况抛出异常。

BTW更简单的解决方案是使用std::map<std::string,double>来保存关联值:

 double Grade::getNumGrade() {
     static std::map<std::string,double> numGrades = {
          { "A",  4.0 } ,
          { "A-", 3.7 } ,
          { "B+", 3.3 } ,
       // ...
     };

     auto found = numGrades.find(strGrade);
     if(found != numGrades.end()) {
         return found->second;
     }
     return 0.0;
 }

它看起来应该是一个自由或静态函数而不是类成员函数:

 double getNumGrade(const std::string& strGrade) {