我一直收到这个错误,不明白为什么没有回来。我试图改变一些东西,但它似乎没有做任何事情。我告诉程序将0返回给用户,但由于某种原因,这仍然是一个问题。任何帮助将不胜感激。谢谢!
代码:
#include <iostream>
using namespace std;
char grade(int x)
{
if (x >= 90) {
return 'A';
}
if (x >= 80) {
return 'B';
}
if (x >= 70) {
return 'C';
}
if (x >= 60) {
return 'D';
}
if (x >= 0) {
return 'F';
}
}
int main(void)
{
int s_grade; // student grade
cout << "What is the score: ";
cin >> s_grade;
cout <<"A score of " << s_grade << " is equal to a grade of " <<
grade(s_grade) << endl;
return 0;
}
答案 0 :(得分:3)
char grade(int x) {
if (x >= 90) {
return 'A';
}
if (x >= 80) {
return 'B';
}
if (x >= 70) {
return 'C';
}
if (x >= 60) {
return 'D';
}
if (x >= 0) {
return 'F';
}
}
如果x
小于0,则此函数不会返回返回语句。在C ++中,这是未定义的行为(但是,正如您所观察到的,编译器可以发出警告)。
一种解决方案是:
char grade(int x) {
if (x >= 90) {
return 'A';
}
if (x >= 80) {
return 'B';
}
if (x >= 70) {
return 'C';
}
if (x >= 60) {
return 'D';
}
if (x >= 0) {
return 'F';
}
return 'X';
}
然后,您的代码可能会将'x'
解释为无效响应,因为传入的成绩无效。
答案 1 :(得分:2)
警告的原因是使用了错误的参数类型。:)
您将参数声明为类型int
。这意味着该参数不仅可以接受非负值,还可以接受
[std::numeric_limits<int>::min(), std::numeric_limits<int>::max()]
或者是否在
范围内使用标题<climits>
[INT_MIN, INT_MAX]
然而,该函数仅分析非负值。
char grade(int x)
{
if (x >= 90) {
return 'A';
}
if (x >= 80) {
return 'B';
}
if (x >= 70) {
return 'C';
}
if (x >= 60) {
return 'D';
}
if (x >= 0) {
return 'F';
}
}
因此,如果将负值传递给函数,则函数具有未定义的行为,因为警告说
控制到达非空函数的结尾
编译器无法知道将向函数提供哪些参数值。
因此,您应该将参数声明为类型unsigned int
。
在这种情况下,该功能可能看起来像
char grade( unsigned int x)
{
if (x >= 90) {
return 'A';
}
if (x >= 80) {
return 'B';
}
if (x >= 70) {
return 'C';
}
if (x >= 60) {
return 'D';
}
if (x >= 0) {
return 'F';
}
}
或以下方式
char grade( unsigned int x)
{
if (x >= 90) {
return 'A';
}
else if (x >= 80) {
return 'B';
}
else if (x >= 70) {
return 'C';
}
else if (x >= 60) {
return 'D';
}
else /* x >= 0 */{
return 'F';
}
}
在main中,变量s_grade
也应该声明为
unsigned int s_grade;
答案 2 :(得分:1)
你的函数char grade(int x)
声称它将返回一个char,但是在最后一个之后它没有return语句。例如,如果i = -1,则不会返回任何内容。
答案 3 :(得分:0)
看起来你定义的函数char grade(int x)
返回一个值,在某些情况下可能不会这样做。编译器将尽可能检查没有执行路径导致函数返回而不指定值。你是否 - 作为程序员 - 知道这不会发生并不重要。
您需要确保x
的所有可能值都会返回值,或使用pragma
或类似值来放宽编译器的检查。
答案 4 :(得分:0)
此警告类似于“无值返回”中所述的警告。如果控制到达函数的末尾并且没有遇到返回,则GCC假定返回没有返回值。但是,为此,该函数需要返回值。在函数结束时,添加一个返回合适返回值的return语句,即使控件永远不会到达那里。
https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.14/common/m1rhnvf.html
char grade(int x) {
if (x >= 90) {
return 'A';
}
if (x >= 80) {
return 'B';
}
if (x >= 70) {
return 'C';
}
if (x >= 60) {
return 'D';
}
return 'F';
}
答案 5 :(得分:0)
您可以将最后一个if语句更改为else,事情应该可以正常工作。
else
return 'F';
而不是
if (x >= 0) {
return 'F';
}
检查负值可以在main中处理。