Algorithmen und Programmierung II
Übungsblatt 1 - Musterlösung
Die Verweise beziehen sich auf die Java
Language Specification.
a)

Syntax: Der Vergleichsoperator
"<"
ist linksassoziativ, daher wird der Ausdruck als (short1 < int1) < long1
ausgewertet
[15.20]. Wie am Syntaxbaum zu erkennen ist, ist der Ausdruck ein
syntaktisch korrekter Java-Ausdruck.
Typ: Der Ausdruck enthält
einen Typfehler: Die Operanden von
Vergleichsoperatoren wie "<"
müssen numerische Typen haben. Betrachtet man den zweiten "<"-Operator ist dessen
linker Operand jedoch vom Typ boolean
(Typen im Diagramm blau eingezeichnet).
Wert: Da der Ausdruck nicht
typkorrekt ist, lässt sich kein Wert bestimmen.
b)

Syntax: Der Vergleichsoperator
"=="
bindet stärker als die Konjunktion "&&". Der Ausdruck ist
syntaktisch
korrekt.
Typ: Die Konjunktion
"&&" erwartet zwei
boole'sche Operanden [15.23]. Der rechte Operand hat hier jedoch den
Typ char, der Ausdruck
ist nicht
typkorrekt.
Wert: Da der Ausdruck nicht
typkorrekt ist, lässt sich kein Wert bestimmen.
c)

Syntax: Der
Präfix-Inkrement-Operator "++",
der Postfix-Dekrement-Operator "--"
und der monadische "+"-Operator haben eine höhere
Bindungsstärke als die beiden dyadischen Operatoren "+" und "-".
Diese sind linksassoziativ, so dass zuerst die monadischen Operatoren,
dann die Subtraktion und als letztes die Addition angewendet werden.
Typ: Der Ausdruck ist
typkorrekt. Alle Teilausdrücke und der gesamte Ausdruck haben den
Typ int.
Wert: Der erste Präfix-Inkrement-Operator
[15.15.1] erhöht den Wert der Variable int1 um
1, bevor der Wert des zusammengesetzten Ausdrucks "++ int1" bestimmt wird. Dieser
hat den Wert 4712. Gemäß der Linksassoziativität und
der Links-Rechts-Auswertung
[15.7] wird als nächstes der Wert von "int1 --" bestimmt. Hier hat
int1 bereits den Wert 4712 und die Verringerung des Wertes von int1
durch den Postfix-Dekrement-Operator erfolgt erst, nachdem der Wert von
"int1 --" bestimmt wurde -
auch dieser Teilausdruck hat also den Wert 4712. Die Subtraktion ergibt
den Wert 0. Das monadische "+" [15.15.3] hat keinen sichtbaren Einfluss
auf den Wert. Die Addition von 0 und 1 ergibt schließlich den
Werte des gesamten Ausdrucks: 1. (int1
hat nach der
Auswertung wieder den Wert 4711.)
d)

Syntax: Der Syntaxbaum zeigt,
dass der Ausdruck syntaktisch korrekt ist.
Typ: Ausdrücke vom Typ float und char
können multipliziert werden. Dazu findet eine Typanpassung statt,
bei der der Ausdruck vom Typ char
zu einem float
konvertiert
wird
[5.6.2]. Entsprechendes gilt beim dyadischen "-"-Operator (die zusammengesetzte -1
wird vom Typ int zu float konvertiert) und beim "/"-Operator (der linke
Ausdruck hat den Typ float,
daher wird die 2 (rechts)
ebenfalls zu
float konvertiert. Der
gesamte Ausdruck hat den Typ float.
Wert: Als ersten findet die
Multiplikation statt. Der Wert von char1 wird zum Typ float konvertiert
(Wert: 97.0f, Unicode-Codierung von 'a')
und mit dem Wert von float1 (0.0f) multipliziert. Das Ergebnis (0) wird
von -1 abgezogen, das monadische "-"
bewirkt eine Vorzeichenumkehrung, so dass schließlich 1.0f durch
2.0f (konvertiert von int
zu float) dividiert wird.
Der Ausdruck hat den Wert 0.5f.
e)

Syntax: Der Ausdruck
enthält einen Syntaxfehler: 3.7
ist ein Wertbezeichner vom Typ double.
Der Präfix-Inkrement-Operator "++"
[15.15.1] erwartet jedoch eine Variable (mit
numerischem Typ) als Operand und kann daher nicht auf 3.7 angewendet
werden.
Typ: Es ist keine Analyse
möglich, da der Ausdruck nicht syntaktisch korrekt.
Wert: Da der Ausdruck
syntaktisch nicht korrekt ist lässt sich kein Wert
ermitteln.
f)

Syntax: Der Syntaxbaum zeigt,
dass der Ausdruck syntaktisch korrekt ist.
Typ: Der ersten Teilausdruck "(double1)" hat den Typ der
enthaltenen Variable double1 (double).
Der zweite Teilausdruck "+ 3.0"
hat den Typ des enthaltenen Wertbezeichners 3.0 (ebenfalls double). Das dyadische "+"
fasst beide zu einem double-Wert
zusammen. Für die abschießende Subtraktion wird, wie
unter d) beschrieben, der Wert von short1
zum Typ double
konvertiert wird, um ihn an den linken Ausdruck anzupassen. Der
Ausdruck hat den Typ double.
Wert: Zunächst werden der
Wert von double1 (3.14) und der des Wertbezeichners 3.0
addiert (6.14). Der monadische "+"-Operator hat keinen Einfluss auf den
Wert. Von der Summe wird der Wert der Variablen short1 (1) subtrahiert.
Der gesamte Ausdruck hat den Wert 5.14. (Der Wert kann binär nicht
exakt dargestellt werden, so dass man im Java durch einen
Rundungsfehler den Wert 5.140000000000001 erhält.)
Abkürzungen in den Diagrammen:
Pr
|
Primary
|
Li
|
Literal
|
Id
|
Identifier
|
Pref
|
Prefix
|
Postf
|
Postfix
|
E
|
Expression
|
UE
|
UnaryExpression
|
| UO |
UnaryOperator |
| BE |
BinaryExpression |
BOp
|
BinaryOperator
|