Inkrementierung
Das Erhöhen einer Variablen um 1 wird auch Inkrementieren genannt.
Erste Beispiele
Das folgende Programm setzt eine Variable i auf den Wert 2, inkrementiert diese dreimal, und gibt dann den Wert dieser Variablen aus.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ int i = 2;
++i;
++i;
++i;
java.lang.System.out.println( i ); }}java.lang.System.out
5
Syntax (vereinfacht)
Anweisungsausdruck .--. .----------.
--->( ++ )--->| Variable |--->
'--' '----------'
Es handelt sich bei diesem Ausdruck um eine Anweisungsausdruck, er darf also auch vor dem Semikolon in einer Ausdruckanweisung verwendet werden.
Typanforderungen (vereinfacht)
Die Variable muß numerisch sein.
Semantik
»( ++v )« ist eine Abkürzung für »( v += 1 )«.
Genauer: für eine Variable »v« bedeutet »( ++v )« dasselbe wie »( v += 1 )«.
Es wird also der Wert um 1 erhöht, und der Wert des gesamten Ausdrucks ist der erhöhte Wert .
Beispiele
Main.java
public class Main
{ public static void main( String[] args )
{ int i = 0;
java.lang.System.out.println( i );
java.lang.System.out.println( ++i );
java.lang.System.out.println( i ); }}transcript
0
1
1- Auswertung von ++i in obigem Programm
- — i hat den Wert 0
++i →
i += 1 →
i = i + 1 →
i = 0 + 1 →
i = 1 →
1- — i hat den Wert 1
- Inkrementierung
Wertspeicher i
enthaelt Wert W
|
V Vorzustand
.--------------.
| ++i |
| |-------> W + 1
| | Wert
'--------------'
| Nachzustand
V
Wertspeicher i
enthaelt Wert W + 1Main.java
public class Main
{ public static void main( String[] args )
{ int a;
int b;
a = 3;
b = ++a * 2;
java.lang.System.out.println( a );
java.lang.System.out.println( b ); }}transcript
4
8
Nachinkrementierung
Es kann sein, daß durch einen Inkrementierungsausdruck der Wert einer Variablen vor der Inkrementierung notiert werden soll. In diesem Fall wird der Operator der Variablen nachgestellt.
Syntax (vereinfacht)
Anweisungsausdruck .----------. .--.
--->| Variable |--->( ++ )--->
'----------' '--'
Es handelt sich bei diesem Ausdruck um eine Anweisungsausdruck, er darf also auch vor dem Semikolon in einer Ausdruckanweisung verwendet werden.
Typanforderungen (vereinfacht)
Die Typanforderungen beim nachgestellten »++« sind wie beim vorangestellten.
Semantik
Wirkung
Die Wirkung beim nachgestellten »++« ist wie beim vorangestellten.
Wert
Der Wert beim nachgestellten »++« ist anders als beim vorangestellten der Wert noch der alte Wert der Variablen (der Wert vor der Erhöhung). Die Bezeichnungen „Nachinkrementierung“ ergibt sich daraus, daß die Inkrementierung in diesem Fall sozusagen „nach“ der Bewertung des Ausdrucks erfolgt.
Beispiele
Main.java
public class Main
{ public static void main( String[] args )
{ int i = 0;
java.lang.System.out.println( i );
java.lang.System.out.println( i++ );
java.lang.System.out.println( i ); }}transcript
0
0
1- Auswertung von ++i in obigem Programm
- — i hat den Wert 0
i++ →
i →
0- — i hat den Wert 1
- Inkrementierung
Wertspeicher i
enthaelt Wert W
|
V Vorzustand
.--------------.
| i++ |
| |-------> W
| | Wert
'--------------'
| Nachzustand
V
Wertspeicher i
enthaelt Wert W + 1Main.java
public class Main
{ public static void main( String[] args )
{ int a;
int b;
a = 3;
b = a++ * 2;
java.lang.System.out.println( a );
java.lang.System.out.println( b ); }}transcript
4
6
Die Nachinkrementierung ist im allgemeinen aufwendiger als die Inkrementierung, weil der alte Wert vor der Inkrementierung erst noch zwischengespeichert oder durch Subtraktion wiederhergestellt werden muß. Aufgrund der vielfältigen Optimierungen moderner Java -Implementationen kann man heute aber nicht mehr davon ausgehen, daß ihre Verwendung ein Programm deswegen notwendigerweise verlangsamt. Die Vorinkrementierung »++i« ist aber auch begrifflich einfacher, da sie genau dem Inkrementierungsausdruck »i+=1« entspricht, sie kann daher als der Normalfall angesehen werden, der bevorzugt werden sollte, wenn es egal ist, ob »++i« oder »i++« geschrieben wird.
Folgendes Programm kann diesen Operator motivieren:
Main.java
public class Main
{ public static void main( String[] args )
{ int i = 0; while( i < 4 )
java.lang.System.out.println( i++ ); }}transcript
0
1
2
3
Würde man statt dessen den Präfixoperator verwenden, so erhielte man ein anderes Ergebnis.
Main.java
public class Main
{ public static void main( String[] args )
{ int i = 0; while( i < 4 )
java.lang.System.out.println( ++i ); }}transcript
1
2
3
4
Dekrementierung
Statt »++« kann auch »--« verwendet werden, wenn der Wert um 1 vermindert (dekrementiert) werden soll. Genauso wie bei »++« kann dieser Operator vor (Dekrementierung) oder hinter (Nachdekrementierung) eine Variable geschrieben werden.
Es handelt sich bei dem Operator »--« um eine einzige lexikalische Einheit. Falls zwei Vorzeichen »-« hintereinander geschrieben werden sollen, so müssen diese irgendwie, beispielsweise durch Leerraum, getrennt werden, damit sie nicht als »--« interpretiert werden.
- Dekrementierung
Wertspeicher i
enthaelt Wert W
|
V Vorzustand
.--------------.
| --i |
| |-------> W - 1
| | Wert
'--------------'
| Nachzustand
V
Wertspeicher i
enthaelt Wert W - 1- Nachdekrementierung
Wertspeicher i
enthaelt Wert W
|
V Vorzustand
.--------------.
| i-- |
| |-------> W
| | Wert
'--------------'
| Nachzustand
V
Wertspeicher i
enthaelt Wert W - 1
Wir bezeichnen hier Inkrementieren und Dekrementieren auch zusammenfassend als Krementieren, obwohl dieser Ausdruck nicht allgemein üblich ist.
Beispiele
Main.java
public class Main
{ public static void main( String[] args )
{ int a;
int b;
a = 3;
b = --a * 2;
java.lang.System.out.println( a );
java.lang.System.out.println( b ); }}transcript
2
4Main.java
public class Main
{ public static void main( String[] args )
{ int a;
int b;
a = 3;
b = a-- * 2;
java.lang.System.out.println( a );
java.lang.System.out.println( b ); }}transcript
2
6
Anweisungsausdrücke
Wir kennen jetzt folgende Anweisungsausdrücke, welche als Ausdruck einer Ausdruckanweisung verwendet werden können.
- Anweisungsausdrücke
- Methodenaufruf
Zuweisung
Verbundzuweisung
Inkrementierung
Nachinkrementierung
Dekrementierung
Nachdekrementierung
Das folgende Programmbeispiel zeigt die Verwendung von Krementierungen als Anweisungsausdrücke.
Main.java
public class Main
{ public static void main( String[] args )
{ int i = 0;
i++;
++i;
i--;
--i;
java.lang.System.out.println( i ); }}transcript
0
Da der Wert eines Anweisungsausdrucks keinen Einfluß auf das Verhalten eines Programms hat, ist es bei Verwendung einer Krementierung als Anweisungsausdruck egal, ob diese mit voran- oder mit nachgestelltem Operator geschrieben wird.
Prioritäten
- Priorität und Assoziativität der bisher behandelten Operatoren
() Eingeklammerter Ausdruck
() ++ -- Aufrufoperator, unaere nachgestellte Operatoren
+ - ++ -- Unaere vorangestellte Operatoren
L * / Multiplikation, Division
L + - Addition, Subtraktion
L < > <= >= Vergleiche
L == != Gleichheitspruefungen
R = = += -= *= /= %= Zuweisung