Operatoren '&&' und '||'

Sogomn

Bekanntes Mitglied
Ich habe eine eher allgemeine Frage:
Wenn ich folgendes if-statement benutze:

Java:
if(bedingung1 && bedingung2 || bedingung3) {
   //CODE
}

Was muss dann erfüllt sein?
Muss [bedingung1] UND [bedingung2/bedingung3]
oder
Muss [bedingung1 und bedingung2] ODER [bedingung3]
 

Sen-Mithrarin

Gesperrter Benutzer
weder noch

da es die logischen ops sind muss "a UND b ODER c" gelten
bei logischen ops gibt es noch folgende besonderheit : die prüfung wird abgebrochen sobald das ergebnis feststeht

ergo : a und b werden logisch UND verknüpft ... kommt hierbei schon false raus wird c gar nicht mehr geprüft ... kommt hingegen true raus ist es danach beim logischen ODER egal ... denn "true ODER X" ergibt immer true

zusmmenfassend : in deinem beispiel wird die letzte bedingung nie beachtet
 

Sen-Mithrarin

Gesperrter Benutzer
hmm ... ok .. so kann man sich irre

Java:
public class Test
{
	public static void main(String[] args)
	{
		System.out.println(false&&false||false);
		System.out.println(false&&false||true);
		System.out.println(false&&true||false);
		System.out.println(false&&true||true);
		System.out.println(true&&false||false);
		System.out.println(true&&false||true);
		System.out.println(true&&true||false);
		System.out.println(true&&true||true);
	}
}

gibt aus

Code:
false
true
false
true
false
true
true
true

also entsprechend letzteres : (a UND b) ODER c
 

rme

Top Contributor
In der Praxis setzt man bei solchen Ausdrücken Klammern, selbst wenn sie unnötig sind, weil niemand diese Regeln auswendig lernen möchte :) Wird von Tools wie CheckStyle sogar vorgeschlagen bzw. als Warnung angezeigt, wenn man es nicht macht.
 

Sen-Mithrarin

Gesperrter Benutzer
naja ... ich bin erstmal grundsätzlich von ausgegangen : && und || haben die selbe priorität ... darum arbeitet java hier ganz normal von links nach rechts durch
zusätzlich weis ich das ein IF abgebrochen wird wenn sein ergebnis bereits feststeht
das jetzt aber wirklich erstmal UND verknüpft wird und es dann noch drauf ankommt was beim folgenden ODER rauskommt ... damit hätte ich jetzt nicht gerechnet

und klar : der compiler hat aus den bools eh ne feste ausgabe erzeugt ... in dem fall hat also der compiler die prüfung schon vollständig machen können da ja feste werte vorgegeben waren
 

Kar

Mitglied
das jetzt aber wirklich erstmal UND verknüpft wird und es dann noch drauf ankommt was beim folgenden ODER rauskommt ... damit hätte ich jetzt nicht gerechnet
Das liegt daran, dass bei einem ODER die rechte Seite ausgewertet werden muss, wenn die linke Seite false ergbit, weil false || true == true.
Bei einem UND ist es klar, dass falls der linke Ausdruck false ist, der gesamte UND-Ausdruck false ergibt und somit die Prüfung der rechten Seite nicht notwendig ist.


A && B || C

A wird immer ausgewertet.
Ist A true, wird B ausgewertet. C wird ausgewertet, wenn B false ist.
Ist A false wird nur noch C ausgewertet.
 
Zuletzt bearbeitet:

Neue Themen


Oben