2017-03-20 64 views
1

函數可以返回其他函數,但是如何?我是用CC函數能否返回其他函數?

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; 
    } 

這不是編譯它說:「控制可能達到非void函數的末尾」。如果我打電話的函數返回然後bool的,爲什麼我應該之前

binary_search(value,values,n); 

return binary_search(value,values,n); 
+2

如果您不輸入'return',那麼該函數將不會返回任何內容... – Lundin

回答

11

隨着

return binary_search(value,values,n); 

不必返回一個函數,你把一個return語句是一個函數調用,並返回什麼函數返回

而在search函數的上下文中,上面的return聲明是正確的。

如果您沒有從聲明爲返回值的函數返回值,則會導致未定義的行爲

要從函數返回值,您需要明確使用return語句。沒有函數調用或隱式返回的鏈接(除非函數main的特殊情況,其中隱含的return 0;語句將最後插入(如果沒有)。

1

您可以返回函數的值,通過

return binary_search(value,values,n); 

函數返回你在做什麼只是調用函數,沒有返回它。您之前的函數調用

+1

_您只能返回該函數返回的函數的值_....您也可以輕鬆地返回函數指針。 ;) – LPs

+1

正確...刪除了單詞_only_ :) – Nick

2

我想你對錶達式和語句之間的區別有些混亂需要一個return關鍵字。 This question將有助於解釋它。真正值得您花時間去理解這一點,因爲這對於初學程序員來說是最棘手的事情之一。

簡言之,binary_search(value,values,n)既具有動作(調用函數)和一個(從函數返回值)。當你自己將它放在一行上時,該值會被計算並丟棄,但操作仍然發生。如果你想要的價值,你需要做一些事情,如return

0

當你寫

binary_search(value,values,n); 

,意味着只有一個函數調用。該控件將被傳遞給「binary_search」函數,執行後控件將返回給調用函數,並且調用函數的下一行將執行,在這種情況下,該函數是無用的。

因此顯示消息「控件可能到達非空函數結束」。

您必須明確告訴計算機返回所需的值。

爲了更好地理解,你可以把它看作

bool someTemporaryVariable = binary_search(value,values,n); 
return someTemporaryVariable; 
0

一些程序員花花公子回答了這個問題你實際上要求。

要回答問題的標題,no,函數不能返回函數類型爲的值(即函數不能返回其他函數)。然而,一個函數可以返回一個值,這是一個指針函數類型:

/** 
* 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 

方式類似,數組表達式「衰變」到指針表達式,函數表達式也會自動轉換爲指針表達式。當我們在get_func中寫return binary_search時,我們不是binary_search;而是將binary_search表達式從「函數返回bool」轉換爲「返回函數指針bool」。請注意,返回類型(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 */); 
... 

雖然我更喜歡用「裸」類型的,除非我打算隱瞞的API背後的類型。