我的C ++代码如下所示:
int f(int i){
if (i > 0) return 1;
if (i == 0) return 0;
if (i < 0) return -1;
}
它正在运作,但我仍然得到:
警告:在返回非空
的函数中没有返回
尽管很明显所有案例都已被涵盖。有没有办法以“正确”的方式处理这个问题?
答案 0 :(得分:8)
编译器并不了解if
条件涵盖所有可能的条件。因此,它认为执行流程仍然可以通过所有if
s。
因为这些条件中的任何一个假设其他条件都是假的,你可以这样写:
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
s。
答案 1 :(得分:4)
有没有办法在&#34;正确的&#34;方式是什么?
一个简单的解决方法是摆脱最后的if。因为前两个要么被调用,所以如果你到达它就必须调用第三个案例
numexpr=2.4.4
我们必须这样做的原因是编译器无法保证在每种情况下都会调用if语句。由于它到达函数的末尾并且它可能没有执行任何if语句,因此它会发出警告。
答案 2 :(得分:0)
帮助编译器理解您的代码。以下列方式重写该功能
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 );
}
答案 3 :(得分:0)
编译器并不知道所有选项都已涵盖,因为根据您的函数的语法,没有任何建议。
简化示例:
int f(int i)
if if if
(int > int), return (int == int), return (int < int), return
像if/else
这样更清晰的结构,每个结构都有一个返回值,产生一个抽象语法树,它清楚地显示每种情况下都有一个返回值。但是,你的依赖于AST中节点的评估,这在语法检查中没有涉及(通过它来发出警告)。
除了纯语法之外,如果编译器依赖于&#34;可能&#34;评估以及试图找出你的程序的行为,它最终需要纠缠自己,并可能遇到停顿问题。即使它设法覆盖了某些情况,这可能会产生更多来自用户的问题,而且还会冒一个全新的错误。