在返回非void的函数中键入No return

时间:2016-01-28 14:02:53

标签: c++

我的C ++代码如下所示:

int f(int i){
    if (i > 0) return 1;
    if (i == 0) return 0;
    if (i < 0) return -1;
}

它正在运作,但我仍然得到:

  

警告:在返回非空

的函数中没有返回

尽管很明显所有案例都已被涵盖。有没有办法以“正确”的方式处理这个问题?

4 个答案:

答案 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;评估以及试图找出你的程序的行为,它最终需要纠缠自己,并可能遇到停顿问题。即使它设法覆盖了某些情况,这可能会产生更多来自用户的问题,而且还会冒一个全新的错误。