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