2016-06-28 17 views
0

我遇到了這段代碼,但我無法理解遞歸如何工作在下面的代碼中,因爲在return語句中使用了一個布爾或運算符,這是我以前從未見過的。它應該如何工作?由於返回語句中使用布爾OR操作,遞歸如何工作以下代碼?

bool match(char *first, char * second) 
{ 
    if (*first == '\0' && *second == '\0') 
     return true; 

    if (*first == '*' && *(first+1) != '\0' && *second == '\0') 
     return false; 

    if (*first == '?' || *first == *second) 
     return match(first+1, second+1); 

    if (*first == '*') 
     return match(first+1, second) || match(first, second+1); //How does it work? 
    return false; 
} 

回答

4

它像所有其他析取:

首先左側,match(first+1, second)進行評估。
如果它是true,整個表達式的結果是true並且沒有其他評估。
如果它是false,則會評估右側match(first, second+1),並且該值將成爲整個表達式的結果。

+2

注意:這樣做的一個重要結果是,如果第一次返回「true」,則不會發生第二次「匹配」調用。如果呼叫可能有副作用,短路行爲很重要。很明顯,知道'||'如何工作的人,但是由於這個問題被問到,所以很清楚。 – ShadowRanger

+0

啊哈!現在很清楚它是如何工作的。非常感謝! –

+0

@molbdnilo,這兩個調用是否同時發生? –

0

它的工作原理大致如同一個變量被分配參數return,然後返回該變量。唯一的區別是,編譯器可能會做返回值優化

1

布爾運算符||&&的一個重要特徵是short-circuit evaluation。這意味着在||的情況下,如果第一個呼叫match(first + 1, second)返回true,則不會進行第二個呼叫,並且將返回true。否則,返回值是第二個調用的返回值。