Zum Hauptinhalt

Weitere Grundlegendende Programmierkonzepte in Java

Operatoren

Als nächstes wollen wir uns die vielen Möglichkeiten anschauen, die uns die Operatoren in Java zur Verfügung stellen. Operatoren verbinden ein oder zwei Aussagen zu einer neuen. Dabei ist genau definiert, welcher Operator welches Ergebnis liefern muss. Es ist aber auch definiert, welche Datentypen er als Eingabe akzeptiert.

= (Wertzuweisungsoperator) 

Mit = wird einer Variable ein Wert zuwiesen. Die Variable muss vom selben Typ sein wie der Wert. Der hat auch einen Rückgabe wert, dies ist der zugewiesene Wert. Aus diesem Grund funktionieren auch Mehrfachzuweisungen int x, y = 0;.

+ (Additionsoperator)

Der Additionsoperator addiert zwei Zahlen miteinander und gibt das Ergebnis zurück.

Es ist nicht erforderlich, dass die beiden Zahlen vom selben Typ sind. Der Rückgabetyp ist immer so klein wie möglich aber so groß wie nötig.

Einige Beispiele:

int + int = int
int + long = long
int + float = float
int + double = double
long + float = float
long + double = double
float + double = double

Wir hatten bereits für den Typ String gelernt, dass der Additionsoperator als Konkatenation verstanden wird also als Aneinanderreihen der Strings. Das selbe geschieht, wenn man ein String mit einer Zahl “addiert” System.out.println("Es gibt " + 8 + " Planeten in unserem Sonnensystem.");.

- (Subtraktionsoperator)

Der Subtraktionsoperator subtrahiert die zweite Eingabezahl von der Ersten und gibt das Ergebnis zurück.

Für den Rückgabetyp gelten die selben Bedingungen wie bei der Addition.
 

 * (Multiplikationsoperator)

Der Multiplikationsoperator multipliziert zwei Zahlen und gibt das Ergebnis zurück.

Für den Rückgabetyp gelten die selben Bedingungen wie bei der Addition.

 / (Divisionsoperator)


Der Divisionsoperator teilt die erste Eingabezahl durch die Zweite und gibt das Ergebnis zurück.

Für den Rückgabetyp gelten die selben Bedingungen wie bei der Addition. Man muss aber wissen, dass im Falle eines ganzzahligen Ergebnistyps die Stellen hinter dem Komma einfach verworfen werden. Beispielsweise ergibt int i = 3 / 2; das Ergebnis i = 1.

Die Division durch 0 ist wie in der Mathematik üblich nicht möglich. Das Programm stürzt mit einem Fehler ab. Dies gilt zumindest für die int 0 und die long 0. Eine Division durch double oder float 0.0 ergibt Unendlich, was als int ausgedrückt 2^31-1 ist.

 % (Modulooperator)

Durch die Verwendung von Modulo erhalten wir den ganzzahligen Rest einer Division. Zum Beispiel ergibt int i = 3 / 2; das Ergebnis i = 1;.

Für den Rückgabetyp gelten die selben Bedingungen wie bei der Addition.

Man hat sehr oft Situationen, in denen man den Wert einer Variable lesen, ändern und in der selben Variable speichern muss z.B. zahl = zahl + 1;. Aus diesem Grund gibt es Kurzschreibweisen:
Kurzschreibweisen
Kurzschreibweisen von Jan Martens

 

 

 

Das Inkrementieren oder Dekrementieren um eins kann sogar noch kürzer geschrieben werden. zahl++ ist gleichbedeutend zu zahl += 1 und zahl-- entspricht zahl -= 1.

Neben den eben beschriebenen arithmetischen Operatoren gibt es auch einige Vergleichsoperatoren. Alle Vergleichsoperatoren liefern ein Ergebnis vom Typ Boolean, also nur wahl oder falsch.

 Vergleichsoperatoren

Vergleichsoperatoren
Vergleichsoperatoren von Jan Martens

 

 

Ein paar Fallstricke gibt es leider noch im Umgang mit den Vergleichsoperatoren. Wir können generell zwei Zahlen unterschiedlichen Typs miteinander vergleichen. Dabei bringt Java die Zahlen wieder auf einen brauchbaren gemeinsamen Typ. Bei einem Vergleich von einer int Zahl mit einer long Zahl ist dies unkritisch. Vergleichen wir aber z.B. eine int 1 mit einer float 1.5 so wird als gemeinsamer Typ int festgelegt und die Zahlen sind für Java gleich. Aber auch der vergleich von Float und Double mit Zahlen gleichen Typs kann wegen der Ungenauigkeit bei der Abbildung unerwartete Ergebnisse liefer. Der Vergleich 100000000.0f == 100000001.0f liefert beispielsweise wahr als Ergebnis, was mathematisch natürlich nicht stimmt.

Der Gleichheits- und der Ungleichheitsoperator sind nicht nur für Zahlen definiert, sondern für alle Datentypen. Bisher haben wir uns nur mit String beschäftigt und zum Vergleich immer die .equals()-Methode verwendet. Das war auch besser, denn für die meisten Datentypen, ist die Gleichheit nicht als Gleichheit des dargestellten Wertes definiert. Der Operator prüft “nur” ob es sich um den selben Speicherbereich handelt und das ist nicht immer einfach nachzuvollziehen. Ein Beispiel mit Erklärung:
 
 Scanner scanner = new Scanner(System.in);
 String a = ".";
 String b = a;
 String c = ".";
 String d = scanner.next(); // Wir geben nur einen . ein und drücken Enter.

 System.out.println(a == b); 
 // ergibt true
 // Da wir b = a gesetzt haben, handelt es sich um den selben Speicher.

 System.out.println(a == c); 
 // ergibt true
 // Der Compiler hat festgestellt, dass beide Strings gleich aussehen und lässt beide Variablen auf den selben Speicher zeigen.

 System.out.println(a == d);
 // ergibt false
 // Der Compiler hat einen neuen Speicherbereich vorgesehen, da er nicht wusste was eingegeben wird.
    

Für den Programmierer ist es oftmals nicht ersichtlich, welche Optimierungen der Compiler vornehmen wird und es ist für ihn meistens auch irrelevant. Wichtig ist, dass man den Operator nur einsetzt, wenn man weiß was er wirklich vergleicht und im Zweifel lieber die .equals()-Methode verwendet, welche meistens die erwarteten Ergebnisse bringt. Als dritte Gruppe wollen wir uns noch einmal die boolschen Operatoren anschauen.

 ! (Verneinungsoperator)

Durch eine Verneinung wird eine Wahrheitsaussage in das Gegenteil verwandelt.

&& (logisches Und)

Durch das logische Und werden zwei Wahrheitsaussagen verbunden. Nur, wenn beide der Aussagen wahr sind, ist das Ergebnis wahr.

 || (logisches Oder)

Das logische Oder liefert als Ergebnis wahr, wenn mindestens eine der zwei Wahrheitsaussagen wahr ist.

 

Es ist wichtig zu wissen, dass zuerst die linke Aussage ausgewertet wird. Ist sie wahr, so wird die Rechte ignoriert. Nur wenn die Linke falsch ist, wird die rechte Aussage ausgewertet. Wenn die rechte Aussage jetzt durch einen Methodenaufruf ermittelt wird und die Methode vielleicht mehr tut als nur das Ergebnis zurück zu geben, so kann dies wesentliche Auswirkungen haben.
Es ist erlaubt mehrere Operatoren in einem Ausdruck zu kombinieren. Hierbei muss aber auf die Kompatibilität der Rückgabetypen und die Reihenfolge der Auswertung geachtet werden. Die folgende Tabelle stellt die Reihenfolge dar:
 
Reihenfolge mehrerer Operationen
Reihenfolge mehrerer Operationen von Jan Martens

 

 

Es gilt also Punkt- vor Strich. Erst danach werden Vergleiche durchgeführt und die logischen Operatoren zuletzt angewandt. Diese Reihenfolge kann durch Klammerung angepasst werden:

 

 
 System.out.println( 2 + 3 * 4 );   // Ergebnis 14
 System.out.println( (2 + 3) * 4 ); // Ergebnis 24