函数可以返回其他函数,但是如何?我在C
中实现二进制搜索bool search(int value, int values[], int n)
{
// TODO: implement a searching algorithm
if(n<1)
{
return false;
}
else
binary_search(value,values,n);
}
和二进制搜索代码是:
//binary search
bool binary_search(int value,int values[],int n)
{
int start = 0;
int end = n-1;
while(end>=start)
{
int mid = (start+end)/2;
if(values[mid]==value)
{
return true;
}
else if(values[mid]>value)
{
end = mid-1;
}
else
{
start = mid+1;
}
}
return false;
}
这不是编译它说“控制可能达到无效功能的结束”。如果我调用的函数返回bool那么为什么我应该在
之前放一个return语句binary_search(value,values,n);
像
return binary_search(value,values,n);
答案 0 :(得分:11)
使用
return binary_search(value,values,n);
你没有返回一个函数,你正在调用一个函数,并返回函数返回的内容。
在search
函数的上下文中,上述return
语句是正确的。
如果您没有从声明为返回值的函数返回值,则会导致未定义的行为。
要从函数返回值,您需要显式使用return
语句。没有函数调用或隐式返回的链接(除了作为main
函数的特殊情况之外,如果没有,则将最后插入隐式return 0;
语句。)
答案 1 :(得分:2)
我认为你对表达式和语句之间的区别有些困惑。 This question将有助于解释它。尝试理解这一点真的值得你花时间,因为这是开始程序员学习的最棘手的事情之一。
简而言之,binary_search(value,values,n)
同时具有操作(调用函数)和值(函数的返回值)。当你将它自己放在一条线上时,会计算并丢弃该值,但操作仍然会发生。如果你想要这个值,你需要对它做一些事情,比如return
。
答案 2 :(得分:1)
您可以返回函数返回的函数的值
return binary_search(value,values,n);
你正在做的只是调用函数,而不是返回它。在函数调用之前需要return
关键字
答案 3 :(得分:1)
写作时
binary_search(value,values,n);
这意味着只进行了一次函数调用。控件将转移到&#34; binary_search&#34;函数和执行后,控制权将被返回给调用函数,并且执行调用函数的下一行,在这种情况下什么都不是。
因此,消息&#34;控制可以达到非空函数的结束&#34;显示。
您必须明确告诉计算机返回所需的值。
为了更好地理解,您可以将其视为
bool someTemporaryVariable = binary_search(value,values,n);
return someTemporaryVariable;
答案 4 :(得分:0)
一些程序员老兄回答了你实际提出的问题。
要回答问题的标题,不,函数不能返回函数类型的值(即函数不能返回另一个函数)。但是,函数可以将指针的值返回到函数类型:
/**
* Returns a pointer to a search function
*/
bool (*get_func( /* lookup params */ ))(int, int *, int)
{
...
if ( /* lookup params indicate binary search */ )
return binary_search; // note that we return the function name only
...
}
/**
* get_func returns a pointer to one of several different searching
* functions, based on the type of search we want to perform
*/
bool (*search_func)(int, int *, int ) = get_func( /* lookup params */);
/**
* Execute the searching function on values through the search_func
* pointer.
*/
if ( search_func != NULL && search_func( value, values, n ) )
// do something
阅读get_func
声明的方法是
get_func -- get_func
get_func( ) -- is a function taking
get_func( /* lookup params */ ) -- some parameters (won't get into details here )
*get_func( /* lookup params */ ) -- returning a pointer
(*get_func( /* lookup params */ ))( ) -- to a function taking
(*get_func( /* lookup params */ ))(int ) -- parameter unnamed of type int
(*get_func( /* lookup params */ ))(int, int * ) -- parameter unnamed of type int *
(*get_func( /* lookup params */ ))(int, int *, int) -- parameter unnamed of type int
bool (*get_func( /* lookup params */ ))(int, int *, int) -- returning bool
类似于数组表达式&#34; decay&#34;对于指针表达式,函数表达式也将自动转换为指针表达式。当我们在return binary_search
中写get_func
时,我们不会调用 binary_search
;相反,binary_search
表达式从类型转换为#34;函数返回bool
&#34; to&#34;指向返回bool
&#34;的函数的指针。请注意,返回类型(bool
)以及参数的数量和类型(int
,int *
和int
)必须在search_func
之间匹配指针,get_func
函数和实际的binary_search
函数。
typedef使这更容易阅读:
/**
* searchFuncType is an alias for type "function taking an int,
* int *, and int, and returning a bool"
*/
typedef bool searchFuncType( int, int *, int );
...
searchFuncType *get_func( /* lookup params */ )
{
...
return binary_search;
...
}
...
searchFuncType *searchFunc = get_func( /* lookup params */ );
...
虽然我更喜欢使用&#34;裸体&#34;类型,除非我打算在API后面隐藏该类型。