Verwenden Sie die Operatoren & amp; = und | = für Bool-Kurzschluss?
Beim schreiben von code, wie dies in C++:
bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();
check_bar()
wird nicht ausgewertet, wenn check_foo()
zurückgegeben false
. (Dies ist anscheinend genannt lazy evaluation
EDIT: Oder nicht, wie schon in den Kommentaren. Es heißt durch kurzschließen oder mit short-circuit-evaluationsondern ist Teil der lazy-evaluation-Prinzip)
Funktioniert das mit der compound assignment operator &=
?
bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?
Für logische OR
alle ersetzen &
mit |
und true
mit false
.
InformationsquelleAutor der Frage iFreilicht | 2014-04-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ab C++11
5.17 Assignment and compound assignment operators
:Jedoch, Sie sind die Vermischung logischer UND die hat Kurzschluss, und das bitweise UND welche nicht.
Dem textausschnitt
&&=
das wäre, wie würden Sie tun, was Sie Fragen, ist nirgendwo finden sich in der Norm. Der Grund dafür ist, dass es gar nicht wirklich gibt: es ist nicht logisch-und-Zuweisungs-operator.InformationsquelleAutor der Antwort paxdiablo
Den Kurzschluss (also lazy) Auswertung ist nur für die logische
&&
und||
. Bitweise&
und|
bewerten sowohl Argumente.InformationsquelleAutor der Antwort Wojtek Surowka
Nein, das tun Sie nicht cut-kurz.
Beachten Sie, dass die
&=
und|=
Operatoren gebildet werden als&
+=
und|
+=
. Bit-Operatoren&
und|
nicht durchführen shortcut-evaluation.Nur booleschen Operatoren
&&
und||
durchführen.Bedeutet es, dass ein abkürzens-Betreiber haben sich traditionell benannt
&&=
und||=
. Einige Sprachen bieten. C/C++ nicht.InformationsquelleAutor der Antwort quetzalcoatl
Den code
allTrue &= check_foo();
entsprichtallTrue = allTrue & check_foo()
In der Sie mit
bitwise AND
und keine lazy evaluation ist durchgeführt.Den
bitwise AND
müssen zwei Argumente, die die binäre Darstellung hat die gleiche Länge und verwendetlogical AND
Betrieb zu vergleichen jeder entsprechenden Paaren von bit.InformationsquelleAutor der Antwort
Erste:
a &= b;
ist nicht das gleiche wiea = a && b;
.a &= b;
bedeuteta = a & b;
. In C/C++ gibt es keinea &&= b;
.Logische UND
a && b
ist etwas wie ein test für 1 bit. Wenn das erste "bit" ist bereits 0, als das Ergebnis immer 0, egal die zweite. So ist es nicht notwendig, um zu bewertenb
wenn das Ergebnis bereits klar ausa
. Die C/C++ - standard erlaubt diese Optimierung.Bitweise UND -
a & b
führt diesen test für alle bitsa
undb
. Sob
muss ausgewertet werden, wenn mindestens ein bit ina
würde ungleich null sein. Man könnte vielleicht wünschen, dass, wenna==0
alsb
würde nicht geprüft werden, aber diese Optimierung ist nicht erlaubt in C/C++.InformationsquelleAutor der Antwort Danvil
Da & ist eine bit-operation, check_foo() wird zuerst ausgewertet werden, unabhängig von dem Wert von allTrue in
und auch
Jedoch check_foo() wird nicht aufgerufen werden, wenn Sie && und alltrue ist falsch wie in:
InformationsquelleAutor der Antwort Dr. Debasish Jana