键入 No return,在函数中返回 non-void

Type No return, in function returning non-void

本文关键字:返回 non-void 函数 No return 键入      更新时间:2023-10-16

我的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 中节点的评估,语法检查中未涵盖该评估(通过语法检查向您发出警告)。

除了纯粹的语法之外,如果编译器在试图找出程序的行为时也依赖于"可能的"评估,它最终需要纠缠自己并可能遇到停止问题。即使它设法涵盖了某些情况,这也可能会从用户那里产生比回答更多的问题,并且还冒着全新的错误水平的风险。