2013-03-21 5 views
5

Dies ist ein sehr triviales Problem: Es gibt vier boolesche Funktionen: a(), b(), c() und d(). Ich möchte sie in der Reihenfolge anrufen, bis die erste true zurückgibt. anstatt das zu tun das traditionelleErsetzen von verketteten ifs durch kurzgeschlossene Operationen

if(!a()) { 
    if(!b()) { 
     if(!c()) { 
      d(); 
     } 
    } 
} 

oder

if(!a() && !b() && !c()) d(); 

Ich dachte über den Ausdruck als kurzgeschlossen Bewertung zu schreiben.

(a() || b() || c() || d()); 

Aber ich habe nie gesehen, dass dieser Test in einem C/C++ Code auf diese Weise durchgeführt wird. Gibt es ein Problem mit diesem Ansatz, den ich vermisse?

Danke.

+0

Ich kann * fünf * boolesche Funktionen sehen. –

+3

@chris das oder ändert nicht die Bedeutung: d() wird nur ausgeführt, wenn alle anderen Funktionen falsch sind. – Loghorn

+3

Ich würde aus Sicht der Wartung dagegen abraten. Es ist vielleicht nicht sofort für die Leute offensichtlich, was der Code macht, wenn er die kurzgeschlossene Version sieht (wenn das ein Problem für dich ist). Die Tatsache, dass Sie nach dem Verhalten bei SO fragen mussten, sollte ein Hinweis darauf sein, was passieren wird, wenn andere Ihren Code lesen. – Michael

Antwort

3

Der von Ihnen geschriebene Code ist gültig. d() wird nur ausgewertet, wenn andere boolesche Funktionen false zurückgeben.

Allerdings ist die kurzgeschlossene Auswertung weniger lesbar und aus Sicht der Wartung fehleranfällig, weil ein Leser es vielleicht nicht trivial verstehen würde.

+0

Warum ist es fehleranfällig? – user666412

+3

Sie haben es falsch verstanden. 'd()' wird ausgewertet, wenn KEINE ANDERE Funktion wahr zurückgegeben hat. Was ich denke, macht Ihren Standpunkt zur Lesbarkeit. –

+0

Danke Ben. War in Eile. – meyumer

2

Sie sind äquivalent, aber die kurzgeschlossene Evaluierungslösung könnte weniger lesbar sein, insbesondere wenn Funktionsnamen lang sind oder Parameter akzeptieren.