Gibt es einen Unterschied zwischen && und & mit bool(s)?

Lesezeit: 5 Minuten

Gibt es in C++ einen Unterschied zwischen dem Tun? && (logisch) und & (bitweise) zwischen bool(s)?

bool val1 = foo();
bool val2 = bar();

bool case1 = val1 & val2;
bool case2 = val1 && val2;

Gibt case1 und case2 identisch oder wenn nicht, wie genau unterscheiden sie sich und warum sollte man das eine dem anderen vorziehen? Ist a bitwise und of bools portabel?

  • Abgesehen vom Schreiben von klarem Code kann die Konvertierung von bool<->int ein Leistungsproblem sein.

    – Gene Bushuyev

    5. Juli ’11 um 2:27

  • Ich denke Fall 1 und Fall2 haben die gleichen Werte, und das bitweise UND von bools ist portabel.

    – Cacho Santa

    5. Juli ’11 um 2:32

  • Nur zur weiteren Information, einer der implementierungsdefinierten Operatoren (gemäß K&R-Buch) ist die Rechtsverschiebung von vorzeichenbehafteten Werten.

    – Cacho Santa

    5. Juli ’11 um 2:40

  • Ihr Beispiel macht sie identisch. Aber ich nenne diese als foo() & bar() vs foo() && bar() hat unterschiedliche Auswirkungen – im letzteren Fall, wenn foo() false zurückgibt, wird bar() (das einen Aufzug zusätzlich zu der Rückgabe von bool starten kann) nie ausgeführt.

    – SF.

    5. Juli ’11 um 9:53

Gibt es einen Unterschied zwischen und mit bools
Nemo

Der Standard garantiert, dass false wandelt sich in Null um und true wandelt in eins als ganze Zahlen um:

4.7 Integrale Umrechnungen

Wenn der Zieltyp bool ist, siehe 4.12. Wenn der Quelltyp bool ist, wird der Wert false in null und der Wert true in eins konvertiert.

Der Effekt in dem von Ihnen angegebenen Beispiel ist also garantiert der gleiche und zu 100% tragbar.

In dem von Ihnen angegebenen Fall generiert jeder anständige Compiler wahrscheinlich identischen (optimalen) Code.

Für boolesche Ausdrücke expr1 und expr2, das stimmt im Allgemeinen nicht expr1 && expr2 ist das gleiche wie expr1 & expr2 weil && führt die Auswertung “Kurzschluss” durch. Das heißt, wenn expr1 bewertet zu false, expr2 wird nicht einmal ausgewertet. Dies kann die Leistung beeinträchtigen (wenn expr2 kompliziert ist) und Verhalten (wenn expr2 Nebenwirkungen hat). (Aber beachten Sie, dass die & form kann tatsächlich schneller sein, wenn es eine bedingte Verzweigung vermeidet … Aus Performancegründen mit so etwas zu spielen ist fast immer eine schlechte Idee.)

Für das spezifische Beispiel, das Sie anführen, bei dem Sie die Werte in lokale Variablen laden und dann mit ihnen arbeiten, ist das Verhalten identisch und die Leistung ist sehr wahrscheinlich.

Wenn Sie sich nicht speziell auf das „Kurzschluss“-Verhalten verlassen, sollten Sie meiner Meinung nach die Formulierung wählen, die Ihre Absicht am deutlichsten zum Ausdruck bringt. Also benutze && für logisches UND und & für Bit-Twiddling UND, und jeder erfahrene C++-Programmierer wird feststellen, dass Ihr Code leicht zu befolgen ist.

  • treffen Ihre Argumente zu? nach | gegen || Danke.

    – PatrickT

    20. November 15 um 4:24 Uhr

  • @PatrickT: Ja, und aus den gleichen Gründen. (“ODER” und “UND” sind duale Operationen; das heißt, wenn Sie “ODER” mit “UND” und “falsch” mit “wahr” vertauschen, gelten alle Gleichungen immer noch. Anders ausgedrückt, ODER und UND sind wirklich gleich Operationen, die nur in positiv-logischen und negativ-logischen Welten leben. Ihre Implementierung in C/C++ respektiert diese Ähnlichkeit, die als “De Morgans Gesetze” bezeichnet wird.)

    – Nemo

    17. Dezember ’15 um 2:46


Bei Verwendung von logischen und &&, wird der rechte Ausdruck nicht ausgewertet, wenn der linke Ausdruck falsch ist.

Viele C/C++/C#-Codes basieren darauf, wie in: if (p != null && p->Foo()).

Für Ihr Beispiel würde ich case2 (logisches und) verwenden. Verwenden Sie nur bitweise, wenn Sie mit Bit-Flags usw. umgehen.

Wenn foo() und bar() jedoch nur bool (0, 1) zurückgeben, dann sind case1 und case2 gleich.

Es gibt einen Unterschied (naja, zwei), obwohl Sie ihn in Ihrem Beispiel nicht sehen würden.

“&” führt eine bitweise “UND”-Operation aus, was bedeutet, dass 0x1 & 0x1 = 0x1, aber 0x1 & 0x2 = 0x0. OTOH, “&&” ist ein boolesches/logisches “AND”, was bedeutet, dass jeder Wert ungleich Null als WAHR behandelt wird, also 0x1 && 0x1 = TRUE (was im Allgemeinen als -1 dargestellt wird, dh alle Einsen [or maybe it’s represented as 1 in C++, I forget]), während 0x1 && 0x2 = TRUE sowie.

Außerdem ist “&&” kurzschließend, dh wenn der erste Operand FALSE ist, wird der zweite nicht ausgewertet. Also, während FALSE & null_pointer->booleanField ==> null pointer exception, FALSE && null_pointer->booleanField = FALSE.

In einigen Fällen kann die Verwendung von bitweisen Operationen einen leichten Leistungsvorteil bringen, aber im Allgemeinen sollten Sie beim Auswerten von booleschen Werten die Doppelformen verwenden, damit Ihr Code unabhängig von der genauen Darstellung von booleschen TRUE und FALSE ist.

  • Kann es jemals einen Bool mit einem Wert von 0x2 geben oder ist das vom Standard verboten (oder sogar eine bedeutungslose Frage)?

    – usr

    18. Okt ’12 um 23:18

  • Der C/C++-Standard legt fest, dass true hat den Integer-Wert 1. Aber wenn Sie zB eine Methode aufrufen, die einen Boolean zurückgibt, besteht immer die Gefahr, dass derjenige, der sie implementiert hat, den Standard nicht gelesen hat.

    – Heiße Licks

    19. Okt ’12 um 0:19

  • Ich bin gerade in die gelaufen 0x1 & 0x2 = 0x0 Fall in freier Wildbahn. Ich hatte eine Funktion funct1() das sollte true zurückgeben, hatte aber tatsächlich keine return-Anweisung. Ich weiß nicht, warum dies keinen Compilerfehler generiert hat, aber es wurde tatsächlich eine undefinierte Integer-Umwandlung als bool zurückgegeben. Also als ich es tat bool ok = funct1(); ok &= funct2(); Ich erhielt falsche Ergebnisse, weil ok nach der ersten Aussage im Überwachungsfenster wahr zu sein schien, aber tatsächlich eine gerade Zahl war, die, wenn sie bitweise mit einem tatsächlichen “wahr” in der zweiten Aussage verbunden wurde, falsch wurde.

    – Denise Skidmore

    25. Februar ’15 um 23:35 Uhr


Algorithmisch gibt es keinen Unterschied, aber die Verwendung von && ermöglicht es Ihnen, den Scheck “kurzzuschließen”. Das heißt, um case2 zu entscheiden, wenn val1 falsch ist, hat der kompilierte Code keinen Grund, den Wert von val2 zu überprüfen, um die Antwort zu bestimmen, wobei case1 erfordert, dass das tatsächliche UND stattfindet.

Realistischerweise wird ein guter Compiler dies erkennen und denselben Code erzeugen … es kommt darauf an, wie gut Ihr Compiler ist.

Gibt es einen Unterschied zwischen und mit bools
makiSTB

&&” ist ein “bedingtes logisches “UND” es wertet den zweiten Ausdruck NUR aus, wenn der erste WAHR ist

&” ist ein “nicht bedingtes logisches UND” <-- (wenn Sie mit booleschen Ausdrücken spielen) wertet es beide Ausdrücke aus


DARÜBER HINAUS
“&” ist ein ‘bitweiser’ Operator, was bedeutet, dass er auf Bitebene arbeitet.

Dieses Beispiel kann Ihnen helfen, besser zu verstehen.

4 = 00000100  // 'four' bit set
5 = 00000101  // 'four' bit and 'one' bit set

00000100 (4) & // AND: only keep bits set in both
00000101 (5)
--------
00000100 (4)

00000100 (4) | // OR: keep bits set in either
00000101 (5)
--------
00000101 (5)

00000100 (4) ^ //  EXCLUSIVE OR: keep bits only set in one but not the other
00000101 (5)
--------
00000001 (1)

1641754837 987 Gibt es einen Unterschied zwischen und mit bools
Javeria

Die logischen Operatoren && und || werden verwendet, wenn zwei Ausdrücke ausgewertet werden, um ein einzelnes relationales Ergebnis zu erhalten. Der Operator && entspricht der booleschen logischen Operation AND. Diese Operation ergibt wahr, wenn ihre beiden Operanden wahr sind, andernfalls falsch.

Der Operator || entspricht der booleschen logischen Operation ODER. Diese Operation ergibt wahr, wenn einer der beiden Operanden wahr ist, und ist daher nur dann falsch, wenn beide Operanden selbst falsch sind.

Gibt es einen Unterschied zwischen und mit bools
Shuvo Sarker

int a = 0, b = 10;

if(a == 1 && (b/a) == 0) cout << "This is okayn"; // the 2nd expression is never checked as the first one is false

cout << "Bingon";

if(a == 1 & (b/a) == 0) cout << "This is not okayn"; // program crashes here trying to divide by zero

cout << "Bingon"; // this will never get printed

  • Obwohl dieser Code die Frage beantworten kann, verbessert die Bereitstellung eines zusätzlichen Kontexts, warum und/oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.

    – Donald Duck

    8. Juni ’17 um 7:46

.

234890cookie-checkGibt es einen Unterschied zwischen && und & mit bool(s)?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy