"控制到达无效功能的结束"是什么意思?

tek*_*agi 21 c warnings compiler-warnings

我在这个二进制搜索算法上遇到了奇怪的编译器错误.我收到警告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;
}
Run Code Online (Sandbox Code Playgroud)

rid*_*rid 34

编译器无法从该代码中判断该函数是否会到达结尾并仍然返回一些内容.为了清楚起见,else if(...)用just 替换最后一个else.

  • (并且编译器害怕的原因是键入的函数返回一个`int`实际上必须返回一个`int`,而不仅仅是函数的结尾) (3认同)
  • @tekknolagi,嗯,我们人类的逻辑非常明确:`val`只能是`<`,`>`或`==`来排序[mid]`,真的没有其他选择......所以它如果这是整个逻辑,就无法捕捉到其他任何东西. (3认同)
  • 摆脱警告的另一种方法是在函数的末尾添加`assert(false);`,以明确告知编译器(和人类读者)您故意省略_else_情况,因为您确定它不会发生。 (2认同)

Ern*_*ill 11

编译器是不够聪明,知道<,>==是一个"完整的".您可以通过删除条件"if(val == sorted [mid])"让它知道 - 这是多余的.Jut说" else return mid;"