webentwicklung-frage-antwort-db.com.de

Unterschiede bei booleschen Operatoren: & vs && und | vs ||

Ich kenne die Regeln für && und ||, aber was sind & und |? Bitte erklären Sie mir diese mit einem Beispiel.

95
Sumithra

Dies sind die bitweisen AND- und bitweisen OR - Operatoren.

int a = 6; // 110
int b = 4; // 100

// Bitwise AND    

int c = a & b;
//   110
// & 100
// -----
//   100

// Bitwise OR

int d = a | b;
//   110
// | 100
// -----
//   110

System.out.println(c); // 4
System.out.println(d); // 6

Vielen Dank an Carlos für den Hinweis auf den entsprechenden Abschnitt in der Java-Sprachspezifikation ( 15.22.1 , 15.22.2 ) bezüglich des unterschiedlichen Verhaltens des Operators basierend auf seinen Eingaben. 

Wenn beide Eingänge boolesch sind, werden die Operatoren als boolesche logische Operatoren betrachtet und verhalten sich ähnlich wie die Operatoren Conditional-And (&&) und Conditional-Or (||), mit Ausnahme der Tatsache, dass sie beim folgenden Kurzschluss nicht kurzschließen ist sicher:

if((a != null) && (a.something == 3)){
}

Das ist nicht:

if((a != null) & (a.something == 3)){
}
117
Justin Niessner

Ich denke, Sie sprechen über die logische Bedeutung der beiden Operatoren.

boolean a, b;

Operation     Meaning                       Note
---------     -------                       ----
   a && b     logical AND                    short-circuiting
   a || b     logical OR                     short-circuiting
   a &  b     boolean logical AND            not short-circuiting
   a |  b     boolean logical OR             not short-circuiting
   a ^  b     boolean logical exclusive OR
  !a          logical NOT

short-circuiting        (x != 0) && (1/x > 1)   SAFE
not short-circuiting    (x != 0) &  (1/x > 1)   NOT SAFE
99
Torres

Ich weiß, dass es hier viele Antworten gibt, die aber alle etwas verwirrend wirken. Nachdem ich einige Nachforschungen im Java Oracle Study Guide durchgeführt hatte, habe ich drei verschiedene Szenarien vorgestellt, wann && oder & ..__ verwendet werden sollte. Die drei Szenarien sind logisch AND , bitweise AND , und boolean AND .

Logisches AND: Logisches AND (auch als bedingte AND bezeichnet) verwendet den Operator && . Die Bedeutung ist kurzgeschlossen: Wenn der linke Operand falsch ist, wird der rechte Operand nicht ausgewertet. 
Beispiel:

int x = 0;
if (false && (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); // "0"

In dem obigen Beispiel wird der Wert, der auf der Konsole von x gedruckt wird, 0 sein, da der erste Operand in der if -Anweisung false ist. Daher muss Java keine Berechnung durchführen (1 == ++ x). Daher wird x nicht berechnet.

Bitwise AND: Bitwise AND verwendet den Operator & . Es wird verwendet, um eine bitweise Operation für den Wert durchzuführen. Es ist viel einfacher zu sehen, was los ist, wenn Sie die Operation mit Binärzahlen betrachten, zB:

int a = 5;     //                    5 in binary is 0101
int b = 12;    //                   12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4

Wie Sie im Beispiel sehen können, wenn die binären Darstellungen der Zahlen 5 und 12 in einer Reihe angeordnet sind, dann erzeugt ein bitweises UND-Vorformling nur eine binäre Zahl, bei der die gleiche Ziffer in beiden Zahlen eine 1 hat. Daher sind 0101 & 1100 == 0100. In dezimal ist 5 & 12 == 4.

Boolean AND: Nun verhält sich der Boolean AND-Operator ähnlich und unterscheidet sich sowohl vom bitweisen AND als auch vom logischen AND. Ich stelle mir vor, dass es sich dabei um ein bitweises UND zwischen zwei booleschen Werten (oder Bits) handelt. Daher wird der Operator & verwendet. Die booleschen Werte können auch das Ergebnis eines logischen Ausdrucks sein. 

Es gibt entweder einen wahren oder einen falschen Wert zurück, ähnlich wie das logische UND, aber im Gegensatz zum logischen UND ist es nicht kurzgeschlossen. Der Grund dafür ist, dass das bitweise AND vorformt werden muss, um den Wert der linken und rechten Operanden zu kennen. Hier ist ein Ex:

int x = 0;
if (false & (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); //"1"

Wenn diese if-Anweisung ausgeführt wird, wird der Ausdruck (1 == ++ x) ausgeführt, obwohl der linke Operand falsch ist. Daher ist der für x ausgedruckte Wert 1, da er erhöht wurde.

Dies gilt auch für logisch OR (||), bitweise OR (|) und boolean OR (|) Hoffe, das löst einige Verwirrung.

23

Die Operatoren && und || sind kurzgeschlossen, was bedeutet, dass sie ihren Ausdruck auf der rechten Seite nicht auswerten, wenn der Wert des Ausdrucks auf der linken Seite ausreicht, um das Ergebnis zu bestimmen.

7

& und | liefern das gleiche Ergebnis wie && und || Betreiber. Der Unterschied ist, dass sie immer beide Seiten des Ausdrucks wo && und || auswerten Beenden Sie die Bewertung, ob die erste Bedingung ausreicht, um das Ergebnis zu bestimmen.

4
Brian Scott

In Java werden die einzelnen Operatoren &, |, ^,! hängen von den Operanden ab. Wenn beide Operanden ints sind, wird eine bitweise Operation ausgeführt. Wenn beide boolesche Werte sind, wird eine "logische" Operation ausgeführt.

Wenn beide Operanden nicht übereinstimmen, wird ein Fehler bei der Kompilierungszeit ausgegeben.

Die Doppeloperatoren &&, || verhalten sich ähnlich wie ihre einzelnen Pendants, aber beide Operanden müssen bedingte Ausdrücke sein, zum Beispiel:

if ((a <0) && (b <0)) {...} oder ähnlich, if ((a <0) || (b <0)) {...}

quelle: Java-Programmierung

2
aaron p.

&&; || sind logische Operatoren .... Kurzschluss

&; | sind boolesche logische Operatoren .... Kurzschluss

Zu Unterschieden bei der Ausführung von Ausdrücken wechseln. Bitweise Operatoren bewerten beide Seiten unabhängig vom Ergebnis der linken Seite. Bei der Auswertung von Ausdrücken mit logischen Operatoren hängt die Auswertung des Ausdrucks für die rechte Hand jedoch von der Bedingung der linken Hand ab.

Zum Beispiel:

int i = 25;
int j = 25;
if(i++ < 0 && j++ > 0)
    System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);

Dies wird i = 26 drucken; j = 25, Da die erste Bedingung falsch ist, wird die rechte Hand umgangen, da das Ergebnis unabhängig von der rechten Seite sowieso falsch ist.

int i = 25;
int j = 25;
if(i++ < 0 & j++ > 0)
    System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);

Aber dies wird i = 26 drucken; j = 26

1
Nickhil

& und | sind bitweise Operatoren für ganzzahlige Typen (z. B. int): http://download.Oracle.com/javase/tutorial/Java/nutsandbolts/op3.html

&& und || arbeiten nur mit Booleans (und Kurzschlüssen, wie bereits in anderen Antworten erwähnt wurde).

1
Bruno

Vielleicht kann es nützlich sein zu wissen, dass die bitweisen AND- und bitweisen OR - Operatoren immer vor dem bedingten AND und dem bedingten OR ausgewertet werden, die in demselben Ausdruck verwendet werden.

if ( (1>2) && (2>1) | true) // false!
1
alexmeia

Während der grundlegende Unterschied darin besteht, dass & für bitweise Operationen verwendet wird, die meistens auf long, int oder byte angewendet werden, wo sie für eine Art Maske verwendet werden können, können die Ergebnisse auch abweichen, wenn Sie sie anstelle von logischem && verwenden.

Der Unterschied ist in einigen Szenarien auffälliger:

  1. Die Auswertung einiger Ausdrücke ist zeitaufwändig
  2. Die Auswertung eines Ausdrucks kann nur durchgeführt werden, wenn der vorige Ausdruck wahr war
  3. Die Ausdrücke haben einige Nebeneffekte (beabsichtigt oder nicht)

Der erste Punkt ist recht einfach, es verursacht keine Fehler, aber es dauert länger. Wenn Sie mehrere verschiedene Überprüfungen in einer Bedingungsanweisung haben, setzen Sie die, die billiger sind oder eher zum Scheitern neigen, nach links.

Für den zweiten Punkt siehe folgendes Beispiel:

if ((a != null) & (a.isEmpty()))

Dies schlägt für null fehl, da die Auswertung des zweiten Ausdrucks eine NullPointerException ergibt. Der logische Operator && ist faul, wenn der linke Operand falsch ist, ist das Ergebnis ungeachtet des rechten Operanden falsch.

Beispiel für den dritten Punkt - Nehmen wir an, wir haben eine App, die DB ohne Auslöser oder Kaskaden verwendet. Bevor wir ein Gebäudeobjekt entfernen, müssen wir das Gebäude eines Abteilungsobjekts in ein anderes ändern. Nehmen wir an, der Operationsstatus wird als boolescher Wert zurückgegeben (true = success). Dann:

if (departmentDao.update(department, newBuilding) & buildingDao.remove(building))

Dadurch werden beide Ausdrücke ausgewertet und das Entfernen von Gebäuden selbst dann durchgeführt, wenn die Aktualisierung der Abteilung aus irgendeinem Grund fehlgeschlagen ist. Mit && funktioniert es wie vorgesehen und stoppt nach dem ersten Ausfall.

Was a || b entspricht, ist gleichbedeutend mit !(!a && !b). Es stoppt, wenn a wahr ist, keine weitere Erklärung erforderlich.

0
Vlasec

Wenn ein Ausdruck ausgewertet wird, der den Booleschen Operator & enthält, werden beide Operanden ausgewertet. Dann wird der Operator & auf den Operanden angewendet. 

Wenn ein Ausdruck ausgewertet wird, der den Operator && enthält, wird der erste Operand ausgewertet. Wenn der erste Operand den Wert false ergibt, wird die Bewertung des zweiten Operanden übersprungen.

Wenn der erste Operand den Wert true zurückgibt, wird der zweite Operand ausgewertet. Wenn der zweite Operand den Wert true zurückgibt, wird der Operator && auf den ersten und den zweiten Operanden angewendet.

Ähnlich für | und ||.

0