【问题标题】:Control may reach end of non-void function C控制可能到达非空函数 C 的末尾
【发布时间】:2014-04-09 22:49:57
【问题描述】:

我无法编译我的代码,出现错误:控件可能到达非 void 函数的末尾

/**
 * Returns true if value is in array of n values, else false.
 */
bool search(int value, int values[], int n)
{
    //Binary search algorithm
    int first = 0;
    int last = n-1;
    int middle = (first+last)/2;

    if (n<1)
        return false;
    else
    {
        while (first <= last)
        {
            if (values[middle]==value)
                return true;
            else if(values[middle]<value)
                first=middle+1;
            else if (values[middle]>value)
            {
                last=middle-1; 
            }
            middle=(first+last)/2;
        }
    }

    if (first>last)
        return false;
}

任何人都可以查看我的代码并帮助我找出问题所在吗?我自己很难看到它!从我的角度来看,这个函数返回真或假

【问题讨论】:

    标签: c function void


    【解决方案1】:

    bool 的返回类型意味着您的函数在退出之前总是希望返回一个布尔值,无论它采用哪种执行路径。就目前而言,似乎检查您可以“通过”最后一个 if 并且永远不会遇到返回语句。要进行验证,则需要以编译器无法合理预期的方式逐步执行您的逻辑。最后简单地改为说:

      if (first>last) {
          return false;
      } else {
          return true;
      }
    

    或者更简洁:

     return (first > last) ? false : true;
    

    【讨论】:

    • return (first &lt;= last);
    • @PhilPerry 更简洁。我想我打算对他现有的代码进行最少的编辑,所以不想使用他的逆测试,但我更喜欢你的方式。另外,我应该指出,代码可能不可能实际上到达函数的末尾,但编译器无法通过检查知道合理的时间,所以你需要else 或等效的来让它开心。
    • 除非我严重遗漏了一些东西,否则没有一条路径可以到达最终的 } 而不会碰到 return(已经导致 UB 的路径除外)
    • 看我上面的评论,编译器只能做表面检查,它不能(在合理的时间内)实际测试一系列输入下的逻辑来验证。
    • 是的,阅读代码的人可能更清楚,也可能不太清楚。对于大多数编译器,我怀疑它对编译代码的效率有很大影响。正如其他人所指出的那样,显然不可能最终掉下来,因此可以消除测试并返回固定的 truefalse。作者可能想对此发表评论,以明确在某些条件不成立的情况下,流程无法达到这一点。
    【解决方案2】:

    在您的代码中,函数不可能落到最后。

    但是,编译器不需要准确诊断函数是否可以到达末尾。一般来说,这样做需要解决停机问题。

    相反,作为一项实际措施,您的编译器正在执行一些基本检查和警告,因为它看到了if ( first &gt; last ) return false;,它没有进行足够的代码分析来确定除非first &gt; last,否则永远无法到达此分支。

    要取消此警告,您只需删除行 if ( first &gt; last )。顺便说一句,这是一个警告,而不是错误;所以它不应该阻止你的编译。

    【讨论】:

    • 谢谢,这确实解决了问题!如果它是真的,它永远不会到达那里并且代码将退出,因此如果它存在 while-loop 我应该只返回 false 意味着找不到数字!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2014-11-25
    相关资源
    最近更新 更多