为什么我总是得到 - 警告:控制达到非无效函数的末尾 [-Wreturn-type]
Why do i keep getting - warning: control reaches end of non-void function [-Wreturn-type]
我一直收到此错误,不明白为什么有些东西没有返回。我尝试改变周围的一些东西,但它似乎没有任何作用。我告诉程序将 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;
}
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,则此函数不会命中 return 语句。在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'
解释为无效响应,这是由于传入的无效成绩而导致的。
警告的原因是使用了错误的参数类型:)
您已将参数声明为具有类型 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';
}
}
总的来说,变量s_grade
也应该声明为
unsigned int s_grade;
你的函数char grade(int x)
声称它将返回一个字符,但如果它没有 return 语句,则在最后一个之后。例如,如果 i =-1,它将不会返回任何内容。
看起来您的函数 char grade(int x)
(您定义为返回值)在某些情况下不能这样做。编译器将尽可能检查是否存在导致函数返回而不指定值的执行路径。作为程序员,你是否知道这不会发生并不重要。
您需要确保x
的所有可能值都会导致返回值,或者使用pragma
或类似值来放宽编译器的检查。
此警告类似于"返回无值"中所述的警告。如果控件到达函数的末尾并且没有遇到返回,则 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';
}
您可以将最后一个 if 语句更改为 else,事情应该可以正常工作。
else
return 'F';
而不是
if (x >= 0) {
return 'F';
}
检查负值可以在 main 本身中处理。
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- C++无效的函数类型转换
- C++无效使用非静态成员函数?
- 模板和无效函数调用C++
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 无效打印(矢量<string>)函数未打印
- 在 stream_descriptor::async_wait 中无效使用非静态成员函数
- C26486 - 不向函数传递可能无效的指针?
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- 调用boost v1.58中的函数时出现模板名称使用无效错误
- 使用 vector.sort() 的非静态成员函数无效使用
- 将数组传递给构造函数无效
- 使用auto参数munmap_chunk()返回auto的函数:无效指针
- Boost::函数绑定的成员函数无效
- 为什么在模板类中声明函数无效?
- 使用非英语文件名调用avio_open函数无效
- Android NDK线程使用非静态成员函数无效