在C

时间:2016-11-10 13:58:40

标签: c recursion

我正在编写二进制搜索功能:

int binsearch(int seq[], int start, int end, int key)
{
    int len = end - start + 1;
    int mid = (start + end) / 2;

    if (len <= 0)
        return -1;
    else if (key == seq[mid])
        return mid;
    else if (key < seq[mid])
        binsearch(seq, start, mid - 1, key);
    else
        binsearch(seq, mid + 1, end, key);
}

我不知道在最里面的电话中我只回过一次。我用笔记本电脑中的gcc编译了它,它运行得很好。

然而,当我使用clang在云计算机中编译该代码时,它向我发出警告,控件可以到达非void函数的末尾。然后,我在那里放了另一个变量,通过递归调用传递返回值。

为什么gcc在没有任何警告的情况下编译它,但是函数给出了正确的输出?这是一种编译器优化吗?我以为C不会通过递归调用自动传递返回值。

2 个答案:

答案 0 :(得分:2)

编译器说明了函数的这些路径

else if (key < seq[mid])
    binsearch(seq, start, mid - 1, key);
else
    binsearch(seq, mid + 1, end, key);

没有退货声明。

你至少需要写

else if (key < seq[mid])
    return binsearch(seq, start, mid - 1, key);
else
    return binsearch(seq, mid + 1, end, key);

答案 1 :(得分:1)

您的程序的行为是 undefined ; 必须显式return所有控制路径上的值。

善良的编译器会警告你这件事;如果你设置了适当的警告级别,gcc肯定会这样做。

我认为您的案例中的解决方法是在return来电之前写下binsearch

(唯一的例外是int main(...),如果缺少,编译器必须引入隐式return 0;