Ergebnistypen von Ausdrücken
Ermitteln Sie die Werte der folgenden Ausdrücke
(Berechnungsvorschriften) und kreuzen Sie den passenden Datentyp an.
Ausdruck | Ergebnis | Boolean | Integer | Double | String |
---|---|---|---|---|---|
3+4 | 7 | X | |||
6/4 | 1 | X | |||
6/4.0 | 1.5 | X | |||
2<3 | true | X | |||
"Lo"+"la" | "Lola" | X |
Übung Lösung...
Ausdruck | Ergebnis | Boolean | Integer | Double | String |
---|---|---|---|---|---|
3-4
|
|||||
3/2
|
|||||
3.0-2
|
|||||
20%3
|
|||||
3>4
|
|||||
"AB"+"BA"
|
Pri. | Operator | Syntax | Richt. | Bedeutung | C++ | Java |
---|---|---|---|---|---|---|
2 | ->
|
Zeiger -> Element | -->
|
Elementselektion | X | |
2 | []
|
Zeiger [Ausdruck], Arrayelement | -->
|
Indizierung | X | |
2 | ()
|
Ausdruck, Typ (Ausdrucksliste) | -->
|
Funktionsaufruf, Werterzeugung |
X | |
2 | ++, --
|
Lvalue++, Lvalue-- | -->
|
Post- In-,De-krement | X | X |
3 | ++, --
|
++Lvalue, --Lvalue | <--
|
Prä- In-,De-krement | X | X |
3 | ~ , !
|
~Ausdruck, !Ausdruck | <--
|
Komplement, Negation | X | X |
3 | - , +
|
-Ausdruck, +Ausdruck | <--
|
unäres Minus, Plus | X | X |
3 | ()
|
(Typ) Ausdruck | <--
|
Typkonvertierung | X | X |
4 | .*
|
Objekt.* Zeiger auf Element | -->
|
Elementselektion | X | |
4 | ->*
|
Objekt.* Zeiger auf Element | -->
|
Elementselektion | X | |
5 | *
|
Ausdruck * Ausdruck | -->
|
Multiplikation | X | X |
5 | /
|
Ausdruck / Ausdruck | -->
|
Division | X | X |
5 | %
|
Ausdruck % Ausdruck | -->
|
Modulo, Divisionsrest | X | X |
6 | +
|
Ausdruck + Ausdruck | -->
|
Addition | X | X |
6 | -
|
Ausdruck - Ausdruck | -->
|
Subtraktion | X | X |
7 | <<, >>
|
Ausd. << Ausd., Ausd. >> Ausd. | -->
|
Linksshift, Rechtsshift | X | X |
8 | <, >
|
Ausd. < Ausd., Ausd. > Ausd. | -->
|
kleiner, größer als | X | X |
8 | <=, >=
|
Ausd. <= Ausd., Ausd. >= Ausd. | -->
|
kleiner, größer gleich | X | X |
9 | ==
|
Ausdruck == Ausdruck | -->
|
gleich | X | X |
9 | !=
|
Ausdruck != Ausdruck | -->
|
ungleich | X | X |
10 | &
|
Ausdruck & Ausdruck | -->
|
bitweises Und | X | X |
11 | ^
|
Ausdruck ^ Ausdruck | -->
|
bitweises EXOR | X | X |
12 | |
|
Ausdruck | Ausdruck | -->
|
bitweises Oder | X | X |
13 | &&
|
Ausdruck && Ausdruck | -->
|
logisches Und | X | X |
14 | ||
|
Ausdruck || Ausdruck | -->
|
logisches Oder | X | X |
15 | =
|
Lvalue = Ausdruck | <--
|
einfache Zuweisung | X | X |
15 | +=, -=,
|
Lvalue += Ausdruck | <--
|
Kombinierte Zuweisung | X | X |
16 | ?:
|
Ausdruck ? Ausdruck : Ausdruck | <--
|
Bedingte Zuweisung | X | X |
Reihenfolge der Auswertung
1+2*3 ergibt den Wert 7, die Reihenfolge der Berechnung ergibt sich durch die Punkt vor Strich Regel:
Zuerst wird der * Operator mit den Operanden 2 und 3 ausgeführt und dann der + Operator.
Jedem Operator wird ein Prioritätswert zugeordnet, Operatoren mit kleinerer Priorität werden zuerst ausgeführt:
* und / haben die Priorität 5, + und - 6, ergibt die Punkt vor Strich Regel.
Klammern
Durch das Setzen von Klammern kann man die Reihenfolge der Berechnung steuern:
(1+2)*3 ergibt den Wert 9.
Auswertung bei gleicher Priorität
"Auf gleicher Prioritätsstufe wird ein Ausdruck von links nach rechts abgearbeitet. Dies wird auch linksassoziativ genannt. Ausnahme: Die unären und Zuweisungsoperatoren werden von rechts nach links abgearbeitet ( rechtsassoziativ ). Generell werden aber zuerst immer die Klammern ausgewertet. Beispiele:
a = b + c + d; ist gleich mit a = ((b + c) + d);
a = b = c = d; ist gleich mit a = (b = (c = d));"
Weitere Beispiele:
4-2+1 ist gleich mit (4-2)+1, der Ausdruck wird von links nach rechts ausgewertet.
2*3 + 3/4 ist gleich mit (2*3) + (3/4)
3+3+3+3 ist gleich mit ((3+3)+3)+3
Diese Auflistung stellt einen Kompromiss dar, die Prioritätsverteilung der Sprachen C++ und Java in einer Tabelle darzustellen.
Operatoren kleinerer Priorität werden zuerst ausgeführt. Es finden sich auch Quellen mit anderer Reihenfolge der Prioritäten:
[netzmafia.de]
Lvalues: Um die genaue Wirkungsweise einiger Operatoren zu beschreiben wird der Begriff Lvalue (L-Wert) benötigt. Ein Lvalue ist ein Ausdruck, der ein Objekt bezeichnet und dadurch mit einer bestimmten Speicheradresse verbunden ist. Übliche Bedeutung ist Variable, die auf der linken Seite steht und der etwas zugewiesen wird: a=2.
[Erweiterter Auszug aus Tabellenbuch Informations- und Telekomunikationstechnik,
Gehlen-Verlag,S 209ff]
Übung
Ausdruck | Berechnungsreihenfolge | Wert des Ausdrucks |
---|---|---|
2*3+3/4
|
(2*3)+(3/4)
|
6 |
3+3+3+3
|
((3+3)+3)+3
|
12 |
2<4||2-3<0&&2>=7
|
2 < 4 || 2 - 3 < 0 && 2 >= 7
|
|
2-3!=0&&3%2==1
|
2 - 3 != 0 && 3 % 2 == 1
|
|
3*5/4-4+2*3
|
3 * 5 / 4 - 4 + 2 * 3
|
Zuweisungsoperatoren
Zuweisungsoperator '='
Zuweisung eines Wertes an eine Variable:
c=1; // c wird der Wert 1 zugewiesen
Der Ausdruck c=1 hat den Wert 1, denn das '=' ist ein Operator,
das Ergebnis des Ausdrucks kann weiterverwendet werden:
x=c=1; // Der Wert von c=1 wird x zugewiesen, // x und c haben nun den Wert 1
Die Reihenfolge der Auswertung ist bei Zuweisungsoperatoren rechts nach links:
a=b=c=3 ist gleich mit a=(b=(c=3))
Zuweisungsoperatoren (+=,-=,*=,/=)
Für eine Zuweisung wie c=c+2 gibt es eine Abkürzung:
c+=2; // c=c+2
Ausdruck | Berechnung | Beispiel mit int c=3 |
---|---|---|
c+=2
|
c=c+2
|
c=3+2 -> c=5
|
c-=2
|
c=c-2
|
c=3-2 -> c=1
|
c*=2
|
c=c*2
|
c=3*2 -> c=6
|
c/=2
|
c=c/2
|
c=3/2 -> c=1
|
x=c+=4
|
c=c+4, x=c
|
c=3+4 -> c=7, x=7
|
Post- und Prä-Inkrement bzw. Dekrement (c++,++c,c--,--c)
Für den Ausdruck c=c+1 gibt es in C und Java eine praktische Abkürzung: c++. Welchen Wert hat der Ausdruck c++?
int x,c=1; | Werte nach der Auswertung | |||
---|---|---|---|---|
Ausdruck | x | c | Wirkung | Bezeichnung |
x=c++ | 1 | 2 | x=c; c=c+1 | Post-Inkrement (Nach-Erhöhung) |
x=++c | 2 | 2 | c=c+1; x=c | Prä-Inkrement (Vor-Erhöhung) |
x=c-- | 1 | 0 | x=c; c=c-1 | Post-Dekrement (Nach-Erniedrigung) |
x=--c | 0 | 0 | c=c-1; x=c | Prä-Dekrement (Vor-Erniedrigung) |
Übung: Ermitteln Sie die Werte der Variablen n und x nach der Auswertung der jeweiligen Ausdrücke.
Wichtig: Vor der Auswertung des jeweiligen Ausdrucks haben die Variablen immer die selben Startwerte, siehe Tabelle oben links!
int x,n=4; | Werte nach der Auswertung | |
---|---|---|
Ausdruck | n | x |
x=2*n
|
4 | 8 |
x=3*n++
|
||
x=n*=4
|
||
x=--n*2
|
||
x=n+2*n-1
|
Sonderfälle und Besonderheiten
"Die Auswertungsreihenfolge der Teilausdrücke einer Priorität untereinander ist jedoch nicht festgelegt und kann von jedem Compiler anders gesetzt werden. Daher sollte es vermieden werden, in einem Ausdruck einen Wert gleichzeitig zu verändern und zu benutzen, wie es die folgenden Beispiele zeigen:
int Teil = 0; Summe = (Teil = 3) + (++Teil);
Das Ergebnis von Summe kann sowohl den Wert 4 als auch den Wert 7 annehmen, je nachdem welche Klammer zuerst ausgewertet wird.
int i = 2;
i = 3 * i++;
Erste Möglichkeit: Es wird 3 * i berechnet und das Ergebnis 6 wird der Variablen i zugewiesen. Anschließend wird i um 1 erhöht. Das Endergebnis ist dann 7. Zweite Möglichkeit: Es wird 3 * i berechnet. Nun wird i um 1 (von 2 auf 3) erhöht. Anschließend wird aber i das Ergebnis der Berechnung 3 * i zugewiesen. Das Endergebnis ist in diesem Fall 6."
[Quelle: www.tfh-berlin.de/~kempfer/skript_c/Kap03.html ]
Noch ein Beispiel (THX Daniel B.): a=2; a*=a++; Wert in Java 4, in C 5, in PHP 6.