& oder &&
-
Niko99 schrieb:
Wenn man zwei logische Ausdrücke hat
...dann stellt sich die Frage gar nicht. Bei logischen Ausdrücken nimmt man
&&und||.
-
weil's hier grad hauptsächlich um die Kurzschluss-Eigenschaften von && und || geht, möchte ich auch nochmal den Fokus auf etwas anderes lenken:
#include <iostream> int main() { using namespace std; cout << "Tach auch!\n"; if (1 & 2) cout << "Ja1\n"; if (1 && 2) cout << "Ja2\n"; cout << "Teschuess!\n"; }Ausgabe:
Tach auch! Ja2 Teschuess!Erklärung:
& : (ganzzahl, ganzzahl) --> ganzzahl
&&: (bool, bool) --> boolBei der (ggf impliziten) Konvertierung von bool nach int kommt entweder 0 oder 1 raus. Bei der (ggf impliziten) Konvertierung von int nach bool kommt false raus, wenn die Ganzzahl 0 war und true sonst.
Im ersten if liefert 1&2 also 0 und wird zu false konvertiert
Im zweiten if liefert 1&&2 true, weil 1 und 2 jeweils zu true konvertiert werden.Das mit dem "Kurzschluss" (also dass && oder || die rechte Seite nur dann auswertet, falls für die Bestimmung des Ergebnisses notwendig) stimmt natürlich auch.
kk
-
Warum gibt es eigentlich kein &&=
alsobool ok=true; ok &&= foo(); ok &&= bar();
-
weil man bei bool auch normal & und | nutzen kann...
und die gibts in kurzform ---> &=, |=
-
Aber er hat schon Recht:
void* bla = 0; bool isItTrue = true; isItTrue &&= bla;Über die Lesbarkeit darf man natürlich streiten.
-
Skym0sh0 schrieb:
weil man bei bool auch normal & und | nutzen kann...
und die gibts in kurzform ---> &=, |=Nein, diese Operatoren haben ja nicht die Kurzschlusseigenschaft.
-
aber man könnte sie nutzen...
ok man verliert ein klein bisschen performance...
(aber mal ehrlich bei bitoperationen und bei eifnachen logischen bool verküpfungen macht das nicht viel, da gibts andre bottlenecks)
-
Skym0sh0 schrieb:
aber man könnte sie nutzen...
ok man verliert ein klein bisschen performance...
(aber mal ehrlich bei bitoperationen und bei eifnachen logischen bool verküpfungen macht das nicht viel, da gibts andre bottlenecks)Person* user; ... bool isAdult = user; isAdult &= user->isOlderThanWhatever(); // Kaboom, Weltuntergangbool dieWeltGehtUnter = wasCriticalOperatationSuccessful(); dieWeltGehtUnter |= terminate();
-
Skym0sh0 schrieb:
aber man könnte sie nutzen...
ok man verliert ein klein bisschen performance...
(aber mal ehrlich bei bitoperationen und bei eifnachen logischen bool verküpfungen macht das nicht viel, da gibts andre bottlenecks)Das nicht nur ein bisschen Performance, sondern das Verhalten ist total unterschiedlich
bool ok=true; ok &= foo(); ok &= bar();bar() wird immer aufgerufen, egal was foo() zurück gibt.
bool ok=true; ok = ok && foo(); //ok &&=foo() ok = ok && bar(); //ok &&=bar()bar wird nur aufgerufen, wenn foo() true zurück gibt.
-
Um Performance geht es da gar nicht, sondern um rechtsseitige Operanden, die im Fall des Falles nicht ausgewertet werden dürfen, z.B.
ptr != 0 && *ptr == 42. Ich denke, die &&= / ||= Operatoren gibt es deshalb nicht, weil sie nur in einem bestimmten Muster vorkommen:bool b = true; b &&= f(); b &&= g(); ...(dh von der ganzen Reihe von Funktionen werden nur solange welche aufgerufen, bis mal eine false zurückgibt)
Der Fall, dass man da nicht einfach
b = b && f()schreiben kann, also dass b ein komplizierterer lvalue-Ausdruck ist, dürfte extrem selten sein.