2016-04-27 31 views
-2

考慮場景:如果語句優化爲在第一個條件爲false時不調用遞歸函數?

int fun(node* a, node* b){ 
    if(a == NULL && b == NULL) return 0; 
    if((a->data == b->data) && (fun(a->left) == fun(b->left)) && (fun(a->right) == fun(b->right)) return 1; 
    return 0; 
} 

如果我們相遇一樣,如果a->data != b->data,然後將遞歸調用進行到(fun(a->left) == fun(b->left))(fun(a->right) == fun(b->right))還是會直接說的條件爲假的條件?

+2

這與優化無關。 if語句的評估語義是核心語言規則的基本部分。 –

+0

這不是重複的,也不是關於短路評估。當這些字段沒有明確指定時,它會詢問多個結構字段的遞歸比較。 – skrrgwasme

+0

它與'if'語句無關,而與邏輯運算符的評估無關。答案將適用於任何情況。 – AnT

回答

2

C使用short-circuit evaluation,所以如果a->data == b->data的計算結果爲false,則不會調用&&右側的fun(a->left)和其他函數。

+1

太棒了。謝謝!!! – Commando

+0

當然。如果它回答你的問題,不要忘記接受這個或另一個答案。 ;-) – vitaut

0

否比較將只有只有用於指定的項目。您需要創建一個函數來對節點進行遞歸比較,或者比較節點結構中的多個字段。

int nodes_equal(node* a, node* b){ 

    if ((a->data != b->data) || (a->left != b->left) || (a->right != b->right)) 
     return 0; 

    return 1; 
}