2016-04-27 2 views
-2

Betrachten Sie das Szenario:Ist if-Anweisung optimiert, um rekursive Funktionen nicht aufzurufen, wenn die erste Bedingung falsch ist?

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

Wenn wir einen Zustand wie wenn a->data != b->data erfüllen, dann wird der rekursiven Aufruf zu (fun(a->left) == fun(b->left)) gemacht werden und (fun(a->right) == fun(b->right)) oder werden sie sagen direkt falsch für den Zustand?

+2

Dies hat nichts mit Optimierung zu tun. Die Bewertungssemantik von if-Anweisungen ist ein grundlegender Teil der Kernsprachregeln. –

+0

Dies ist kein Duplikat und fragt nicht nach einer Kurzschlussauswertung. Es fragt nach rekursiven Vergleichen mehrerer Strukturfelder, wenn diese Felder nicht explizit angegeben sind. – skrrgwasme

+0

Es hat nichts mit 'if' Aussage zu tun, sondern mit der Auswertung logischer Operatoren. Die Antwort wäre in jedem Zusammenhang anwendbar. – AnT

Antwort

2

C verwendet short-circuit evaluation, so fun(a->left) und andere Funktionen auf der rechten Seite von && wird nicht aufgerufen werden, wenn a->data == b->data falsch ergibt.

+1

Ehrfürchtig. Danke!!! – Commando

+0

Sicher. Vergessen Sie nicht, diese oder eine andere Antwort zu akzeptieren, wenn sie Ihre Frage beantwortet. ;-) – vitaut

0

Nein. Der Vergleich wird nur für die von Ihnen angegebenen Elemente vorgenommen werden. Sie müssten eine Funktion erstellen, um einen rekursiven Vergleich auf Ihren Knoten durchzuführen oder mehrere Felder innerhalb Ihrer Knotenstruktur zu vergleichen.

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

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

    return 1; 
} 
Verwandte Themen