一个函数可以在C中返回其他函数吗?

时间:2017-03-20 13:28:24

标签: c function return

函数可以返回其他函数,但是如何?我在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);

5 个答案:

答案 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)以及参数的数量和类型(intint *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后面隐藏该类型。