“control reaches end of non-void function”是什么意思?

问题描述 投票:0回答:11

我在这个二进制搜索算法上遇到了奇怪的编译器错误。我收到警告

control reaches end of non-void function
。这是什么意思?

int binary(int val, int sorted[], int low, int high) {
    int mid = (low+high)/2;

    if(high < low)
        return -1;

    if(val < sorted[mid])
        return binary(val, sorted, low, mid-1);

    else if(val > sorted[mid])
        return binary(val, sorted, mid+1, high);

    else if(val == sorted[mid])
        return mid;
}
c warnings compiler-warnings
11个回答
52
投票

编译器无法从该代码判断函数是否会到达终点并仍然返回一些东西。为了清楚起见,将最后一个

else if(...)
替换为
else


15
投票

编译器不够聪明,无法知道

<
>
==
是一个“完整集”。您可以通过删除条件“if(val == sorted[mid])”让它知道——这是多余的。就说“
else return mid;


1
投票

如果函数是非空的,这意味着它必须在到达函数块结束之前返回一些东西[_}]。所以,当我们只给出 if 和 else-if 语句时,编译器无法从该代码中分辨出任何这些语句中的一部分将被评估为真并返回一些东西。意味着,如果所有条件的评估结果为假,那么控件将到达函数的末尾,而不返回任何东西,这是错误的。


0
投票

始终构建至少最小的优化。使用

-O0
,编译器可以用来确定执行不能到达函数末尾的所有分析都已被禁用。这就是您看到警告的原因。你唯一应该使用
-O0
的时间是进行逐行调试,这通常不是一个好的调试方法,但这是大多数开始使用 MSVC 的人学到的...


0
投票

我有同样的问题。我下面的代码不起作用,但是当我用“else”替换最后一个“if”时,它起作用了。错误是:可能到达非空函数的结尾。

int shifted(char key_letter)
  {
        if(isupper(key_letter))
        {
            return key_letter - 'A'; 
        }

        if(islower(key_letter)   //<----------- doesn't work, replace with else

        {                                            


            return key_letter - 'a'; 
        }

  }

0
投票

无论条件语句如何,确保您的代码返回给定返回类型的值

此代码片段显示相同的错误

int search(char arr[], int start, int end, char value)
{
    int i;
    for(i=start; i<=end; i++)
    {
        if(arr[i] == value)
            return i;
    }
}

这是稍作改动后的工作代码

int search(char arr[], int start, int end, char value)
{
    int i;
    int index=-1;
    for(i=start; i<=end; i++)
    {
        if(arr[i] == value)
            index=i;
    }
    return index;
}

0
投票

表示正在搜索需要完成的函数

else if(val == sorted[mid]) return mid;

所以,删除 if() 部分并修改代码或在末尾添加一个返回 int 的 else() 。


0
投票

编译器本身不会知道你给出的条件是最佳的..这意味着你已经涵盖了所有情况.. 因此它总是需要一个 return 语句......所以要么你可以用 else 改变 last else if 或者只在 last else if 之后写 return 0 ;`int binary(int val, int sorted[], int low, int high) { int mid = (low+high)/2;

if(high < low)
    return -1;

if(val < sorted[mid])
    return binary(val, sorted, low, mid-1);

else if(val > sorted[mid])
    return binary(val, sorted, mid+1, high);

else if(val == sorted[mid])
    return mid;
return 0; }`

0
投票

如果它是“主要”功能,只需确保返回 0 或将其更改为 主函数() 到 无效主要()


0
投票

在代码末尾添加二进制函数:

int binary(int val, int sorted[], int low, int high) { .... return 1;}

如果不满足其中一个条件,则int函数应该返回int。


-6
投票

添加到您的代码:

"#include < stdlib.h>"

return EXIT_SUCCESS;

main()

的结尾
© www.soinside.com 2019 - 2024. All rights reserved.