我正在编写二进制搜索功能:
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不会通过递归调用自动传递返回值。
答案 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;
。