键入 No return,在函数中返回 non-void
Type No return, in function returning non-void
我的C++代码如下所示:
int f(int i){
if (i > 0) return 1;
if (i == 0) return 0;
if (i < 0) return -1;
}
它正在工作,但我仍然得到:
警告:不返回,在函数中返回非无效
尽管很明显涵盖了所有情况。有没有办法以"适当"的方式处理这个问题?
编译器没有掌握if
条件涵盖所有可能的条件。因此,它认为执行流仍然可以超过所有if
。
由于这些条件中的任何一个都假定其他条件为 false,因此您可以这样编写:
int f(int i) {
if (i > 0) return 1;
else if (i == 0) return 0;
else return -1;
}
由于 return
语句最终终止了一个函数,我们可以将其缩短为:
int f(int i) {
if (i > 0) return 1;
if (i == 0) return 0;
return -1;
}
请注意缺少两个else
。
有没有办法以"适当"的方式处理这个问题?
一个简单的解决方法是摆脱最后一个if。 由于前两种情况要么被调用,要么不被调用,因此如果您到达它,则必须调用第三种情况
int f(int i){
if (i > 0) return 1;
if (i == 0) return 0;
return -1;
}
我们必须这样做的原因是编译器不能保证在每种情况下都会调用您的 if 语句。 由于它到达函数的末尾,并且可能没有执行任何 if 语句,因此它会发出警告。
只需帮助编译器理解您的代码即可。按以下方式重写函数
int f(int i){
if (i > 0) return 1;
else if (i == 0) return 0;
else return -1;
}
您也可以编写函数,例如
int f( int i )
{
return i == 0 ? 0 : ( i < 0 ? -1 : 1 );
}
在一行中编写函数的另一种方法是:
int f( int i )
{
return ( i > 0 ) - ( i < 0 );
}
编译器不知道涵盖了所有选项,因为就函数的语法而言,没有任何建议。
一个简化的示例:
int f(int i)
if if if
(int > int), return (int == int), return (int < int), return
一个更清晰的结构,如if/else
,每个都有返回,会产生一个抽象-语法-树,它清楚地表明每种情况下都有一个返回。但是,您的依赖于 AST 中节点的评估,语法检查中未涵盖该评估(通过语法检查向您发出警告)。
除了纯粹的语法之外,如果编译器在试图找出程序的行为时也依赖于"可能的"评估,它最终需要纠缠自己并可能遇到停止问题。即使它设法涵盖了某些情况,这也可能会从用户那里产生比回答更多的问题,并且还冒着全新的错误水平的风险。
相关文章:
- 返回非 void 的函数中没有返回语句警告
- "Warning : No return statement in function returning non-void"是什么意思?
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 抑制非平凡无用的警告"control may reach end of non-void function"
- "Control reaches end on non-void function" with do { return result; } while(condition);
- 我在C++年写了一个findClosestPrime(),但Xcode抱怨"Control may reach end of non-void function"
- 如何修复空虚拟方法的"warning: no return statement in function returning non-void [-Wreturn-type]"
- 收到此警告" Control may reach end of non-void function "
- 即使我已经涵盖了所有情况,也会收到"control reaches end of non-void function"警告
- 布尔函数"Control reaches end of non-void function"错误
- 返回一个void数组*
- 困惑为什么"control may reach end of non-void function"
- 当调用带有警告"control reaches end of non-void function"的函数时,(实际上)会发生什么?
- 返回带有 void 函数的排序数组以查找中位数
- "Control may reach end of non-void function"警告
- 键入 No return,在函数中返回 non-void
- 为什么'control reaches end of non-void function'只是一个警告?合法吗?
- 从函数-堆损坏返回的void*指针
- 函数中没有返回语句,返回非void
- 使用 'std::function<void(...)>' 调用 non-void 函数