~Java4Beginners~
~Java4Beginners~

Arithmetische Operatoren

Wir können in Java folgende Arithmetische Operatoren verwenden:
  • + (Addition)
  • - (Subtraktion)
  • * (Multiplikation)
  • / (Division)
  • % (Modulo)
  • ++ (Postinkrement oder Preinkrement)
  • -- (Postdekrement oder Predekrement)

Beispiel-Code für Arithmetische Operatoren

Bevor wir uns die weniger bekannten Operatoren Modulo, Inkrement und Dekrement anschauen, ein kleines Programm, in welchem alle Mathematischen Operatoren verarbeitet sind.

public class AritmetischeOperatoren 
{
    public static void main (String[] args)
    {
        int addition, subtraktion, division, multiplikation, modulo;
        int preAddition, postAddition, preSubtraktion, postSubtraktion;
        int i;
        addition = 3+2;
        System.out.println("Addition 3 + 2 = "+addition);
        subtraktion = 5-3;
        System.out.println("Subtraktion 5 - 3 = "+subtraktion);
        multiplikation = 2*3;
        System.out.println("Multiplikation 2 * 3 = "+multiplikation);
        division = 4/2;
        System.out.println("Division 4 / 2 = "+division);
        modulo = 4%2;
        System.out.println("Modulo 4 % 2 = "+modulo);
        i = 1;
        postAddition = i++;
        System.out.println("Postinkrement = "+postAddition+" Wert von i : "+i);
        i = 1;
        preAddition = ++i;
        System.out.println("Preinkrement = "+preAddition+" Wert von i : "+i);
        i = 2;
        postSubtraktion = i--;
        System.out.println("Postdekrement = "+postSubtraktion+" Wert von i : "+i);
        i = 2;
        preSubtraktion = --i;
        System.out.println("Predekrement = "+preSubtraktion+" Wert von i : "+i);
    }
}
Nach Ausführung des Programmes erhalten wir folgende Ausgabe.

Zur Funktionsweise von Addition, Multiplikation, Subtraktion und Division gibt es eigentlich dank der Schulmathematik nichts weiteres zu Erläutern. Sehen wir uns aber die anderen, weniger bekannten, Operatoren etwas genauer an.

Modulo

Bei einer Modulo-Berechnung handelt es sich um die sogenannte Restwertdivision. Es wird in diesem Falle eine Ganzzahldivision durchgeführt und der dadurch resultierende Rest, der nicht mehr durch den Divisior geteilt werden kann, ist das Ergebnis der Restwertdivision.<
Sehen wir uns das am Beispiel 19 geteilt durch 7 an. Die 7 passt in die 19 als Ganzzahl genau 2 mal. Das Ergebnis einer Ganzahldivision (oder in Java auch Integer-Division) wäre somit die 2. Die nun verbleibende Menge zwischen 2 * 7 und dem Dividenten ist der sogenannte Rest. Dieser Rest, in diesem Beispiel also die 5, bildet das Ergebnis unser Modulo-Berechnung.

Inkrement, Dekrement

Mit dem Inkrementoperator erhöhen wir den Wert jeweils um 1, während wir mit einem Dekrementoperator den Wert jeweils um 1 erniedrigen. Wenn eine Zuweisung mit Inkrement oder Dekrement erfolgt, so ist es ausschlaggebend, ob ++ oder -- vor der Variable oder nach der Variable steht.
Bei einer Zuweisung a = ++b; wird als erstes b um 1 erhöht und der Wert zugewiesen. Beim Dekrement wird gleich verfahren. Wir sprechen hier von einem Preinkrement oder auch Predekrement bei --.
Bei einer Zuweisung a = b-- wird als erstes a der Wert von b zugewiesen und erst danach b um 1 erniedrigt. Diese Schreibweise nennen wir Postdekrement oder Postinkrement bei ++.

Probleme bei der Division

Bei der Division kann der ein oder andere Fehler auftreten, wenn wir nicht auf unsere Datentypen achten.

   int ergebnis1 = 7/2;  // Division 1
   double ergebnis2 = 7/2;  // Division 2
Rein Mathematisch gesehen, erwarten wir bei einer Division von 7/2 als Ergebnis eine 3,5. Nicht so, wenn wir diese Division in Java durchführen.
Betrahten wir uns die erste Division int ergebnis1 = 7/2;. Das Ergebnis dieser Division ist 3. Dies hängt an der Auswahl des Datentypes int, welcher nur ganzzahlige Ziffernfolgen aufnehmen kann. Für Gleitkommazahlen benötigen wir den Datentyp double oder float.
Wenn wir allerding mit double ergebnis2 = 7/2; rechnen, erhalten wir als Ergebnis nicht 3.5 sondern 3.0. Stellt sich a) die Frage warum und b) wie wir das beheben können.
Um zu verstehen, warum wir das Ergebnis erhalten, müssen wir uns zu allererst verdeutlichen, dass als erstes die Berechnung 7/2 erfolgt und erst danach die Zuweisung in die Ergebnisvariable passiert. Somit müssen wir uns fragen, welchen Datentyp die JRE den Zahlenliteralen 7 und 2 zuweist. Schauen uns wir daher die Abarbeitung von Zahlenliteralen von der JRE an.
Die JRE prüft Zahlenliterale in folgender Reihenfolge:
  1. Handelt es sich bei dem Zahlenliteral um eine Gleitkommazahl, so wird der Datentyp double vergeben.
  2. Handelt es sich bei dem Zahlenliteral um eine Zahl, die kleiner als –2.147.483.648 oder größer als 2.147.483.647 ist? Wenn ja, dann handelt es sich beim Literal um einen Long-Wert.
  3. Wenn Punkt 1 und Punkt 2 nicht zutreffen, weist die JRE dem Zahlenliteral den Datentyp int zu.
Somit lässt sich erkennen, dass das auftretende Problem nicht am Datentyp der Ergebnisvariablen liegt, sondern an der Berechnung.
Wir müssen dafür sorgen, dass zumindest 1 Zahlenliteral als double-Wert interpretiert wird. Die wohl einfachste Methode ist wohl folgende.

    double ergebnis2 = 7.0/2;
    //oder unter Verwendung des Expliziten Typcastings
    double ergebnis3 = (double) 7/2; 
Wenn wir mit dem expliziten Typcasting arbeiten ist zu beachten, dass das nächste Literal nach dem Castbefehl (double) zum Datentyp double gecastet wird.
Kleine Denkaufgabe zum Schluss:
Zu welchem Ergebnis führt double ergebnis2 = (double)(7/2);?
Auflösung folgt im Kapitel Verbundoperatoren.
nach oben Java4Beginners -- Seitenversion 1.0 -- Stand: 2017-04-07