C++ kurzschließen der booleans
Ich bin neu in c++ und bin gespannt, wie der compiler verarbeitet lazy evaluation von booleans. Zum Beispiel,
if(A == 1 || B == 2){...}
Wenn A nicht gleich 1 ist, ist B==2 Teil auch schon mal bewertet?
- wow, das war der Schnellste 6 Antworten je. danke Jungs.
- Sie könnte getestet werden, indem Sie eine Funktion erstellen, mit der eine Nebenwirkung (d.h., etwas drucken nach standard-out) und bringen es in die zweite position (unter der Annahme, dass die erste Bedingung false ist). Auch die Doku sagt uns, dass || ist ein Kurzschluss-operator.
- aber wo wäre der Spaß in der Beobachtung alle diese Antworten fließen in?
- beachten Sie, dass es hat nichts zu tun mit der lazy evaluation. Während es stimmt, dass lazy Bewertung der Sprachen machen dieses Verhalten trivial zu implementieren; in C/C++ - Fall, es ist nur für Sie zusammengestellt gleichbedeutend mit einer Reihe von verschachtelten ifs.
- Tests sind kein Ersatz für Normen und Dokumentation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, die
B==2
Teil wird nicht ausgewertet. Dies wird als short-circuit-evaluation.Edit: Als Robert C. Cartaino weist zu Recht darauf hin, wenn der logische operator ist überladen, Kurzschluss-Auswertung nicht stattfindet, dass gesagt wurde, warum jemand würde überlastung ein logischer operator ist mir schleierhaft).
, Es sei denn, die
||
- operator ist überladen, der zweite Ausdruck nicht mehr ausgewertet wird. Dies wird als "short-circuit-Evaluierung."Im Falle der logischen UND (&&) und das logische ODER (||), der zweite Ausdruck wird nicht ausgewertet, wenn der erste Ausdruck ist ausreichend, um festzustellen, der Wert des gesamten Ausdrucks.
In die Falle, die Sie oben beschrieben haben:
...der zweite Ausdruck nicht ausgewertet werden, weil
TRUE || ANYTHING
immer ausgewertetTRUE
.Ebenso
FALSE && ANYTHING
immer ausgewertetFALSE
, so wird diese Bedingung auch dazu führen, eine short-circuit-evaluation.Ein paar schnelle Notizen
&&
und||
Betreiber.And
undOr
Betreiber. Aber dieAndAlso
undOrElse
Operatoren, die speziell auf do führen short-circuit-evaluation.B==2 Teil wird nicht ausgewertet.
Vorsichtig sein! Nicht etwas wie ++B==2, da drüben!
C++ gilt Kurzschluss Boolesche Auswertung eines Ausdrucks also, der
B == 2
ist nie ausgewertet und der compiler kann sogar vollständig weglassen.B == 2
Zweig ist immer evaluiert und, wennA
ist nachweislich ein konstanter Ausdruck, der gleich1
ein guter compiler wird das komplette auslassen der Filiale, wenn Sie dazu aufgefordert zur Optimierung der code-Größe. Der code wird kompiliert, aber der optimizer ist kostenlos strip tote äste, wenn Sie nie ausgeführt werden. Für früh-Programmierer ist es wichtig zu verstehen, grundlegende Konzepte wie das, was ein linker oder optimierende compiler tut, um Ihren code, damit Sie machen schlechte Annahmen.Der compiler behandelt diese durch die Generierung von intermediate springt. Für den folgenden code:
zusammengestellt, um pseudo-assembler, könnten sein:
Dies ist short-circuit-evaluation, wie James sagt. Lazy evaluation ist etwas ganz anderes.
Nein ist es nicht.
Gleiche mit
&&
, wenn eine falsch ist, es stört das die Bewertung der anderen.B == 2
wird nie ausgewertet.Sehen Short-Circuit-Evaluation für weitere Informationen.