2017-10-06 58 views
-1

我不断收到此错误,并不明白为什么有些东西没有返回。我试图改变一些东西,但它似乎没有做任何事情。我告诉程序返回0给用户,但由于某种原因,这仍然是一个问题。任何帮助将不胜感激。谢谢!为什么我一直得到 - 警告:控制达到非无效功能的结束[-Wreturn-type]

代码:

#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; 

} 
+1

['使用命名空间标准;'是一个不好的做法](https://stackoverflow.com/q/1452721/2176813),永远不要使用它。此外,在C++中,如果函数没有参数(没有它通常被认为更具代表性),则不必在参数列表中放置'void' – tambre

+5

如果'x'小于零,返回'grade' ? – 1201ProgramAlarm

+1

如果没有你的'if's执行你不返回任何东西 – user463035818

回答

1

你的功能char grade(int x)声称它会返回一个字符,但如果它没有return语句后的最后一次。例如,如果我= -1,它不会返回任何东西。

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'作为一个无效的响应,从一个无效的品位导致传递

+0

谢谢!一切都在工作! – Josh

0

看起来好像你的函数。您定义的返回值的char grade(int x)在某些情况下不能这样做。编译器会尽可能检查是否没有执行路径导致函数返回而没有指定值。作为程序员,你是否知道这不会发生并不重要。

您需要确保所有可能的值x都会导致返回值,或者使用pragma或类似的函数来放宽编译器的检查。

0

此警告类似于“无值返回”中所述的警告。如果控制到达函数的结尾并且没有遇到返回,GCC将假定没有返回值的返回。但是,为此,该函数需要返回值。在函数结尾处,添加一个返回适当的返回值的返回语句,即使控制不会到达那里。

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'; 
} 
2

警告的原因是使用了错误的参数类型。:)

你声明的参数具有类型int。这意味着,参数可以在接受范围不仅非负值而且负值

[std::numeric_limits<int>::min(), std::numeric_limits<int>::max()] 

,或者如果在范围

[INT_MIN, INT_MAX] 

使用头<climits>然而该函数仅分析非负值。

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'; 
    } 
} 

因此,如果为负值将被传递给函数,则函数未定义的行为,因为作为警告说

控制到达非void函数结束

的编译器无法知道将为该函数提供什么参数值。

所以你应该声明该参数的类型为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'; 
    } 
} 

而在主变量s_grade还应声明如下

unsigned int s_grade; 
0

你可以将最后一条if语句改为else,并且事情应该正常工作。

else return 'F'; 代替

if (x >= 0) { return 'F'; } 检查负值可以在主本身进行处理。

相关问题