2016-04-27 7 views
-2

は、シナリオを検討してください。最初の条件がfalseの場合、if文は再帰関数を呼び出さないように最適化されていますか?

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; 
} 
関連する問題