C 如何修复-控件可能达到非无效函数的末尾

C 如何修复-控件可能达到非无效函数的末尾,c,cs50,C,Cs50,我在cs50课上遇到问题,我不得不写二进制搜索函数。 当尝试运行代码时,会出现以下消息:控件可能到达非void函数的末尾。我试图通过在最后一行添加returnfalse来修复,但这会使输出始终为false。请给我一些提示 这是我的密码: bool search_r(int value, int values[], int l, int r) { int v = values[(l + r) / 2]; int right = r; int left = l; if

我在cs50课上遇到问题,我不得不写二进制搜索函数。 当尝试运行代码时,会出现以下消息:控件可能到达非void函数的末尾。我试图通过在最后一行添加returnfalse来修复,但这会使输出始终为false。请给我一些提示

这是我的密码:

bool search_r(int value, int values[], int l, int r) {
    int v = values[(l + r) / 2];
    int right = r;
    int left = l;
    if ((l + r) / 2 > 0) {
        if (v == value) {
            return true;
        } else 
        if (v > value) {
            right = ((l + r) / 2);
            search_r(value, values, left, right);
        } else
        if (v < value) {
            left = ((l + r) / 2);
            search_r(value, values, left, right);
        }
    } else {
        return false;
    }         
}

最后一个else是不必要的,如果您只返回false,它将完全满足您的需要。但是您可能应该在if分支中返回true。或者使函数完全不返回,因为您没有使用返回值,如果返回值始终为false,那么它就没有多大用处。

考虑这样一种情况,即if条件不满足,并且程序完成时没有给出返回值。现在由于else条件,这是不可能的。但是编译器不知道这一点,因此希望确保该函数返回一个值,因为它是一个非void函数。 删除else条件并简单地添加

return false;

程序结束时将解决问题。

您的函数有几个问题:

必须从递归调用返回值以进行搜索。此错误导致警告,因为函数在嵌套的if语句之后没有return语句。使其返回为假;结尾处的值不正确,因为如果找到该值,递归调用应返回true。 如果l或r非常大,l+r/2可能会溢出。在这种情况下,结果是不正确的。计算中间指数的正确方法是l+r-l/2。 终止测试不是l+r/2>0,它只测试中间索引是否大于0。改为使用lvalue。 使用l作为变量名有点令人困惑,因为它在视觉上与1非常相似,尤其是用于代码的固定间距字体。 以下是更正的版本:

bool search_r(int value, int values[], int left, int right) {
    if (left < right) {
        int middle = left + (right - left) / 2;
        int v = values[middle];
        if (v == value) {
            return true;
        } else
        if (v > value) {
            return search_r(value, values, left, middle);
        } else {
            return search_r(value, values, middle + 1, right);
        }
    } else {
        return false;
    }
}
你的职能:

bool search_r(int value, int values[], int left, int right)
指示将返回布尔值。我认为@chqrlie对此有很好的回应


您应该返回一个默认值,该值不受任何循环或条件的影响,以防不满足这些条件。

它将完全相同并使错误消失:就像mithilesh的回答一样,这将修复警告,但不会修复算法缺陷。对于数组中的所有值,该函数都将返回false,但只有一个值。@chqrlie也许你是对的。我没有关注函数的功能,只是警告的原因。您不返回递归结果的任何原因?或者您可能正在寻找。这将修复警告,但不会修复算法缺陷。该函数将为数组中除单个值以外的所有值返回false。
bool found = search_r(value, array, 0, length);
bool search_r(int value, int values[], int left, int right)