gpt4 book ai didi

c - 二分查找中的返回语句

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:08 26 4
gpt4 key购买 nike

我对下面两个说法有点迷惑。

下面的程序是使用二进制搜索从排序数组[无重复项]中找到元素的索引。

int bin(int *arr,int l,int h,int k)
{
int mid;
if(l>h)
return -1;
if(l==h)
{
return arr[l]==k?l:-1;
}
else
{
mid=(l+h)>>1;
if(arr[mid]==k)
return mid;
else if(k>arr[mid])
bin(arr,mid+1,h,k);
else
bin(arr,l,mid-1,k);
}
}

我的程序没有任何问题[工作完美]:

我对以下两个陈述感到困惑:

bin(arr,l,mid-1,k); http://ideone.com/p1o5U
返回 bin(arr,l,mid-1,k); http://ideone.com/lMhgB

使用上述任何语句都会给出正确的结果。
哪种语句在时间上更有效率?
程序如何在没有 return 语句的情况下正常运行?

最佳答案

How the program is working fine even without return statement?

在这种情况下,我会说在实践中没有区别,因为递归结束于一个返回语句,与你给它的参数无关(是的,即使你在最后两次调用中没有指定它) .然而,这是一个特定于编译器的细节,您不应该依赖它!

Which statement is more efficient in terms of time?

您可能会认为带有 return 语句的那些更有效,因为在这种情况下它不需要阅读“else”检查,但是,差异非常小。


但是请注意,如果没有 return 语句,它被认为是“不正确的”,即使它“有效”,并且 -Wall 应该给你警告。

查看此 similar question还。从该答案复制:

What you see is probably caused by the implementation detail that function on some architectures return (integral values) by setting a well known register to that value (eax on i386). Therefore, if the bottommost recursive call does return and set this register, and the calls in-between don't stomp on that register, you see that it sort of works. However, you mustn't rely on that.

编辑:更改了措辞,以不暗示该行为是有意优化。不知道是不是。无论如何,有些编译器会做一些事情,有些则不会。

关于c - 二分查找中的返回语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11168652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com