Logische Operatoren && und &

esqueeze

Mitglied
Hi!

Irgendwie verstehe ich den Unterschied zwischen & und && bzw. | und || nicht.
Mir ist klar, das dies jeweils der strikte bzw. nicht strikte Operator ist, und das beispielsweise
& beide Seiten auswertet, während && die zweite schon garnicht mehr auswertet, wenn die erste
falsch ist.

Nur wo liegt der Sinn? Irgendwie kommt doch unterm Strich genau das Gleiche bei heraus?!

Beispiel:

System.out.println(1==1 & 2==3);
System.out.println(1==1 && 2==3);

=> Beides false.
 

eRaaaa

Top Contributor
es geht darum, dass du unter Umständen dort aber etwas prüfen musst, was nicht gerade eine so simple Prüfung wie 2==3 ist, sondern etwas komplizierter und rechenintensiver.
Java:
	public static boolean foo(...){
		//lange pruefung
		return ...
	}

// und
if(foo(..) && foo(..)){

da macht`s dann evtl. Sinn den zweiten Methodenaufruf von foo() nicht auch noch aufzurufen, wenn der erste eh schon false ist.
 

AlexSpritze

Bekanntes Mitglied
Der unterschied ist die Rechenleistung. Er muss bei && nicht beides auswerten, das spart rechenleistung.

bei
Code:
Bedingung1 && Bedingung2
muss "er" auch die zweite Bedinung auswerten, wenn die erste true ist; nur wenn die erste false ist, "weiß" "er" das Ergebnis der logischen Verknüpfung ohne die zweite auszuwerten ...
 

esqueeze

Mitglied
Okay, das es Rechenleistung spart, hatte ich mir auch überlegt. Gibt es sonst noch einen Grund bzw. habt ihr vllt. noch ein weiteres Beispiel? danke!!
 

Schandro

Top Contributor
Es ist nicht nur für die Performance wichtig. Beispiel:
Java:
if(connection == null || !connection.isValid()){
Wenn das connection-Object noch garnicht initialisiert wurde oder mittlerweile invalide ist, soll es neu zugewiesen werden...
Diese Überprüfung MUSS mit || statt | geschrieben werden, da ansonsten immer eine NullPointerException fliege würde wenn connection null ist. Wenn man dagegen || benutzt und connection null ist, wird der Teil
Code:
!connection.isValid()
garnicht mehr ausgeführt, dementsprechend fliegt auch keine NullPointerException.
 

esqueeze

Mitglied
Es ist nicht nur für die Performance wichtig. Beispiel:
Java:
if(connection == null || !connection.isValid()){
Wenn das connection-Object noch garnicht initialisiert wurde oder mittlerweile invalide ist, soll es neu zugewiesen werden...
Diese Überprüfung MUSS mit || statt | geschrieben werden, da ansonsten immer eine NullPointerException fliege würde wenn connection null ist. Wenn man dagegen || benutzt und connection null ist, wird der Teil
Code:
!connection.isValid()
garnicht mehr ausgeführt, dementsprechend fliegt auch keine NullPointerException.

Danke dafür :) Das hat mir die Sache schon sehr verdeutlicht! :)
 
E

eeeaaaeeeaaa

Gast
semantische unterschied ergeben sich, wenn die nachfolgenden bedingungen nur dann geprüft werden sollen, wenn die vorherigen true ergeben (&&) - oder wenn nachfolgende nicht mehr ausgewertet werden sollen (||). diese schreibweisen ersparen if-verschachtelungen oder wiederholung gleicher sachen.

Java:
if a
 b

if c
 b

if a || c then b[/code]

Java:
if a
 if b
  c

if a && b then c
 

Andi_CH

Top Contributor
Java:
if (function1() & function2()) ...
function2() wir in jedem Fall ausgeführt - es könnte ja sein, dass sie sideffects hat die gewollt sind.

Java:
if (reference != null && reference.function3()) ...
In diesem Fall macht & defitniv KEINEN Sind ;-)
 

Marco13

Top Contributor
Java:
if (function1() & function2()) ...
function2() wir in jedem Fall ausgeführt - es könnte ja sein, dass sie sideffects hat die gewollt sind.

Wenn function2 ausgeführt werden MUSS, ist das an sich IMHO schon fragwürdig, aber wenn, dann sollte man es definitiv nicht so schreiben, sondern eher als
Code:
boolean b1 = function1();
boolean b2 = function2();
if (b1 && b2) { ... }
 

Andi_CH

Top Contributor
Natürlich ist es zu hinterfragen wenn funktionen sideffects haben aber es gibt leider einen Unterschied zwischen Wunschdenken und der realen Welt.
(Ich gönne dir gerne mal einen Blick in die Sourcen hier - da werden alle Berechnungsresultate in lokalen Variablen gespeichert und von späteren Berechnungsschritten verwendet - nein, ich habe nicht behauptet, dass das ideal ist)

Warum das so geschrieben werden soll wie du es machst ist allerdings auch erwas fraglich und macht überhaupt keinen Unterschied.
 

Marco13

Top Contributor
Zumindest sind wir uns einig, dass die (sich nirgendwo manifestierende) Anforderung "diese Methode muss aufgerufen werden" kritisch ist. Es könnte aber auch sein, dass der Rückgabewert der "Seiteneffekt" ist ;) Man könnte sich einen... vergleichsweise realitätsnahen und an sich nicht wirklich "schlechten" Anwendungsfall vorstellen:
[c]if (set.add(object0) & set.add(object1)) { ... }[/c]
bzw.
[c]if (set.add(object0) && set.add(object1)) { ... }[/c]
Das einzig "schlechte" daran ist die Schreibweise. Der wichtige Unterschied dieses Codes zur Alternative
Code:
boolean setHasChanged0 = set.add(object0);
if (!setHasChanged0)
{
    boolean setHasChanged1 = set.add(object1);
    if (setHasChanged1) { ... }
}
bzw.
Code:
boolean setHasChanged0 = set.add(object0);
boolean setHasChanged1 = set.add(object1);
if (setHasChanged0 && setHasChanged1) { ... }
ist: Das zweite ist übersichtlicher - es steht deutlicher und leichter erfassbar da, was gemacht wird. Es werden die Elemente zum Set hinzugefügt (und zwar explizit, in einzlenen Zeilen, bei denen Klar ist, wann sie ausgeführt werden), es wird sich in sprechenden Variablen gemerkt, ob die Menge sich durch das Hinzufügen geändert hat, und diese booleans dann unmißverständlich abgefragt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Operatoren Was will mir die Tabelle in meinem Lehrbuch sagen? (logische Operatoren) Java Basics - Anfänger-Themen 4
lulas[]args Fehler - Logische Operatoren Java Basics - Anfänger-Themen 9
L [Logische Operatoren] referenzierbar? Java Basics - Anfänger-Themen 3
G Logische und Bitweise Operatoren Java Basics - Anfänger-Themen 2
D Logische Operatoren Java Basics - Anfänger-Themen 6
M logische operatoren Java Basics - Anfänger-Themen 2
T Logische Operatoren Java Basics - Anfänger-Themen 39
R Binäre logische Operatoren Java Basics - Anfänger-Themen 21
Jamie logische Verknüpfung zur Schaltjahr-Berechnung Java Basics - Anfänger-Themen 30
D Logische Frage zu Settern und Gettern Java Basics - Anfänger-Themen 4
G Logische Verknüpfungen Java Basics - Anfänger-Themen 10
B Methoden Logische Reihenfolge in Programmen? Java Basics - Anfänger-Themen 4
L Logische Kerne auslesen Java Basics - Anfänger-Themen 6
M Logische Schaltungen nachbauen. Java Basics - Anfänger-Themen 19
sqsh logische verknüpfung Java Basics - Anfänger-Themen 3
J Logische Verknüpfungen mit JAI Java Basics - Anfänger-Themen 2
M Logische Verneinung Java Basics - Anfänger-Themen 13
B Spielereien mit bit wise Operatoren und langen Binärzahlen Java Basics - Anfänger-Themen 3
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
Kleinerals2 NaN Operatoren Java Basics - Anfänger-Themen 3
S Und-Abfrage mit mehreren Ungleich-Operatoren Java Basics - Anfänger-Themen 17
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
D Erste Schritte Operatoren zur Manipulation von Bits "~" Java Basics - Anfänger-Themen 5
M Operatoren Umwandlung div. Operatoren Java Basics - Anfänger-Themen 7
S Bitweise Operatoren" >>>",">>","<<" erklärung Java Basics - Anfänger-Themen 5
G operatoren Java Basics - Anfänger-Themen 3
beatles Operatoren Operatoren - Berechnung Java Basics - Anfänger-Themen 40
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
X Shift-Operatoren Java Basics - Anfänger-Themen 1
P Bitweise Operatoren Java Basics - Anfänger-Themen 2
Phillip Bitweise Operatoren Java Basics - Anfänger-Themen 11
C Operatoren Java Basics - Anfänger-Themen 6
P Taschenrechner, operatoren Java Basics - Anfänger-Themen 4
M Einfache und Doppelte Operatoren Java Basics - Anfänger-Themen 3
S Operatoren & Terminierung Java Basics - Anfänger-Themen 1
A Bitweise Operatoren Java Basics - Anfänger-Themen 1
O Priorität bei Operatoren Java Basics - Anfänger-Themen 4
N Potenzierung durch einfache Operatoren Java Basics - Anfänger-Themen 13
B Geschwindigkeitsabhängigkeit von Anz. d. Operatoren pro Zeile Java Basics - Anfänger-Themen 12
M hexadezimal in binär mit Hilfe von Shift-Operatoren Java Basics - Anfänger-Themen 6
S Arithmetische Operatoren Java Basics - Anfänger-Themen 7
L Erste Schritte Fragen zu Arrays, Inkrement Operatoren, Dekrement Operatoren ? Java Basics - Anfänger-Themen 9
H Nur Zahlen, Klammern und Operatoren Java Basics - Anfänger-Themen 3
D Frage zu Bit Operatoren in der Programmierung Java Basics - Anfänger-Themen 9
P Anzahl der else if Operatoren begrenzt?? Java Basics - Anfänger-Themen 7
W Was tun die Operatoren ? und : (Bedingungen) Java Basics - Anfänger-Themen 15
W Datentypen Operatoren für eigenen Datentyp nutzen Java Basics - Anfänger-Themen 2
S Datentypen Operatoren und Ausdrücke (formel richtig rechnen) Java Basics - Anfänger-Themen 8
? Operatoren && || Java Basics - Anfänger-Themen 10
M Aufgabe Arithmetische Operatoren Java Basics - Anfänger-Themen 12
H While Schleife mit Operatoren Java Basics - Anfänger-Themen 14
T Rechnen mit Operatoren Java Basics - Anfänger-Themen 2
M Arithmetische Operatoren Java Basics - Anfänger-Themen 40
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
M Sind ternäre Operatoren für einen guten Programmierstil wichtig ? Java Basics - Anfänger-Themen 10
E IF Anweisung mit logischen Operatoren Java Basics - Anfänger-Themen 18
JStickman Was bringen Bit-Operatoren? Java Basics - Anfänger-Themen 14
J Matheaufgabe aus String mit mehreren Operatoren Java Basics - Anfänger-Themen 16
D Grundlagen - Operatoren Java Basics - Anfänger-Themen 5
1 Datentypen Rückgabetyp von Java-Operatoren Java Basics - Anfänger-Themen 2
V Bitweise Operatoren in der Grafikprogrammierung Java Basics - Anfänger-Themen 2
SebSnake Operatoren für eigene Datentypen Java Basics - Anfänger-Themen 3
C Variablen für Operatoren Java Basics - Anfänger-Themen 3
W Rangfolge von Operatoren Java Basics - Anfänger-Themen 16
N zahlen und operatoren gemischt in einem Feld Java Basics - Anfänger-Themen 9
C Dynamische Operatoren! Java Basics - Anfänger-Themen 5
G Shift Operatoren Java Basics - Anfänger-Themen 4
R Bedingte Opeatoren / Verschachtelte Operatoren Java Basics - Anfänger-Themen 4
7 Operatoren in der While Schleife Java Basics - Anfänger-Themen 5
H Postfix Operatoren Java Basics - Anfänger-Themen 2
S Variablen + Operatoren "mixen" Java Basics - Anfänger-Themen 5
F Experimente mit Bit-Operatoren Java Basics - Anfänger-Themen 7
G Nutzen von bitweisen Operatoren Java Basics - Anfänger-Themen 8
J Operatoren in Java Java Basics - Anfänger-Themen 2
S Verwendung bitweiser Operatoren Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben