Ausdrücke in Java sind alles was einen Rückgabewert liefert: Show
OperatorenJava verfügt über
Arithmetische OperatorenDie arithmetischen Operatoren können auf die folgenden Typen angewendet werden
Die Division von Ganzzahlen ergibt immer ganzzahlige Ergebnisse! Java arbeitet ohne eine Erkennung des Überlaufs der Wertebereiche. Der Entwickler muss selbst die entsprechenden Vorsichtsmaßnahmen ergreifen. Weiterhin gibt es einstellige (unäre) arithmetische Operatoren
Die folgen drei Anweisungen bewirken das gleiche: a = a + 1; a++; ++a;Bei Inkrementen mit gleichzeitiger Zuweisung ergeben jedoch unterschiedliche Werte für den zugewiesenen Wert
Beispiel
Arithmetik der Ganzzahlen
Arithmetik der FließkommazahlenBei der Arithmetik mit Fließkommazahlen werden im Gegensatz zu den Ganzzahlen Überläufe erkannt. Die Fließkommazahlen besitzen eine Reihe Konstanten:
VergleichsoperatorenGleichheit bzw. Ungleichheit bezieht sich auf den Wert der Variablen x und y
Logische OperatorenDie logischen Operatoren wirken auf den Typ Boolean der nur den Wert wahr oder falsch kennt.
BedingungsoperatorDer dreistellige (ternäre) Bedingungsoperator (Konditionaloperator) erlaubt eine Zuweisung von dem Ergebnis einer Bedingung abhängig zu machen. Er hat die Form: <ausdruck1> ? <ausdruck2> : <ausdruck3>ausdruck1 muss einen boolschen Wert ergeben. Wird ausdruck1 wahr, so wird ausdruck2 der entsprechenden Variable zugewiesen. Wird ausdruck1 unwahr, so wird der ausdruck3 zugewiesen Hiermit kann man Zuweisungen wie die Folgende formulieren int maximum; int x = 1; int y =2 ; maximum = (x > y) ? x : y ;Das Ergebnis ist 2, da y (=2) größer als x (=1) ist. Bedingt auswertende logische && und || OperatorenDie bedingt auswertenden Operatoren werten Terme nur soweit aus bis das Endergebnis fest steht. Dies macht sie sehr effizient. Im Beispiel: boolean a = ((1<3) || (4>5));wird der Term (4>5) nicht mehr ausgewertet. Da (1<3) wahr ist, steht das Endergebnis schon fest. Die bedingt auswertenden logischen Operatoren wendet man neben Ihrem Geschwindigkeitsvorteil auch gerne an um potentielle Fehler und Ausnahmen zu vermeiden. Ein Beispiel hierfür ist: if ((a>0) && (Math.sqrt(a)>2))Die Wurzel wird nur ausgewertet wenn a größer als Null ist. Vorsicht: Durch die bedingte Auswertung können unterschiedliche Ergebnisse enstehen wenn in einem Ausdruck gleichzeitig ein Wert verändert wird! Beispiel:
Das Postinkrement (b++) in der linkten bedingten oder Bedingung wird nicht ausgeführt, da der Ausdruck (a>1) schon wahr geworden ist. BitoperatorenMit Bitoperatoren werden alle Bits einer Variablen einzeln manipuliert.
Beispielpackage s1.block2.skript; public class BitOperator { public static void main(String[] args) { int a = 7; int b = 6; int result; result = a & b; System.out.println("a = " + a + "; b = " + b + " result = " + result); result = a | b; System.out.println("a = " + a + "; b = " + b + " result = " + result); result = a ^ b; System.out.println("a = " + a + "; b = " + b + " result = " + result); } }Ergebnisa = 7; b = 6 result = 6 a = 7; b = 6 result = 7 a = 7; b = 6 result = 1Erklärung
Bitschiebeoperatoren
Beispielpackage s1.block2.skript; public class ShiftingBits { public static void main(String[] args) { int x = 4; int result; int shift = 1; result = x << shift; System.out.println("x = " + x + "; shift = " + shift + " result = " + result); result = x >> shift; System.out.println("x = " + x + "; shift = " + shift + " result = " + result); result = result >> shift; System.out.println("x = " + x + "; shift = " + shift + " result = " + result); result = result >> shift; System.out.println("x = " + x + "; shift = " + shift + " result = " + result); result = result >> shift; System.out.println("x = " + x + "; shift = " + shift + " result = " + result); } }Ergebnisx = 4; shift = 1 result = 8 x = 4; shift = 1 result = 2 x = 4; shift = 1 result = 1 x = 4; shift = 1 result = 0 x = 4; shift = 1 result = 0 Die interne Darstellung der verwendeten Werte:
Zuweisungs- und VerbundoperatorenDas Gleichzeichen = dient in Java als Zuweisungsoperator. Die Anweisung x = y + z;ist nicht als mathematische Gleichung zuverstehen, sondern als Zuweisung des Ausdrucks auf der echten Seite (y+z) auf die Variable x auf der linken Seite. Zuweisungen wie: x = y = 8;sind auch möglich. Sie haben die gleiche Bedeutung wie y = 8; x = y;Für die meisten binären Operatoren gibt es Verbundoperatoren mit denen man einer Variable etwas zuweisen kann und gleichzeitig den alten Wert verwenden kann:
AuswertungsreihenfolgeFür Ausdrücke mit mehreren Operatoren gelten die folgenden Regeln in Bezug auf die Reihenfolge der Auswertung:
Unäre Operatoren haben alle die gleiche Priorität Ausführungsreihenfolge von OperatorenDie Ausführungsreihenfolge von Operatoren bestimmt wie ein Term aufgelöst wir. Tipp: Es ist guter Programmstil Terme übersichtlich zu gestalten. Verwenden Sie im Zweifelsfall Klammern!
Auswertung von Operatoren mit gleicher PrioritätEs kann vorkommen, dass ein Ausdruck mehrere Operatoren der gleichen Priorität besitzt. In diesen Fällen wird die Auswertereihenreihenfolge durch die Assoziativität der Operatoren bestimmt.
Ist ein Operator linksassoziativ, wird zuerst der linke Operand ausgewertet. Das Beispiel zeigt den Plus- und Minusoperator. Beide haben die gleiche Priorität. Hier wird zuerst der Operand a+b ausgewertet. Einige Operatoren in Java sind rechtsassoziativ. Ein Beispiel hierfür ist der Zuweisungsoperator Bewertungsreihenfolge der Operanden eines Operators
Diese Regel ist insbesondere wichtig, da Methoden und diverse Operatoren Nebeneffekte haben können. Das bedeutet, dass diese Operatoren den Wert von Variablen während der Auswertung des Gesamtausdrucks verändern. Beispiele sind die Inkrement- und Dekrementoperatoren. j = i-- -i;ist ein zulässiger Ausdruck in Java. Der Wert der j zugewiesen wird ist immer 1; Die Auswertung dieser Zuweisung geschieht in den folgenden Schritten:
Ein Beispielprogramm zum Testen: package s1.block2.skript; public class PrePostInkrement { public static void main(String[] args) { int i = 4; int j; j=i-- -i; System.out.println("i: " +i+", j= "+j); } }Ausgabe: i: 3, j= 1Die Auswertung des Ausdrucks und der Zuweisung j= i-- -i; findet wie folgt statt:
Regeln für den Ergebnistyp von arithmetischen Ausdrücken (Widening Conversions)Java kann alle arithmetischen Operationen auch ausführen wenn die Zahlentypen im Ausdruck unterschiedlich sind. Das Ergebnis der Berechnung hängt von den Typen des Ausdrucks ab. Es gilt in der folgenden Reihenfolge:
|