(Ausdruck wird ausgewertet)
(Anweisung wird ausgeführt)
Vgl. Trennung (in Pascal, Ada)
(nämlich Unterprogramm-Aufrufe)
(sondern nur Ausdrücke).
=
ein Operator,
(d. h. die Zuweisung ist syntaktisch ein Ausdruck)
Wdhlg: Syntaxbaum, Präzedenz, Assoziativität.
Was druckt diese Anweisung?
System.out.println ( 12345 + 5432l );
dieses und einige der folgenden Beispiele aus: Joshua Bloch, Neil Gafter: Java Puzzlers, Addison-Wesley, 2005.
...addiert Zahlen und verkettet Strings.
System.out.println ("foo" + 3 + 4); System.out.println (3 + 4 + "bar");
aus praktischen Gründen sind arithmetische und relationale Operatornamen überladen
(d. h.: ein Name für mehrere Bedeutungen)
Überladung wird aufgelöst durch die Typen der Argumente.
int x = 3; int y = 4; ... x + y ... double a; double b; ... a + b ... String p; String q; ... p + q ...
in vielen Sprachen postuliert man eine Hierarchie von Zahlbereichstypen:
byte⊆int⊆float⊆double
im allgemeinen ist das eine Halbordnung.
Operator mit Argumenten verschiedener Typen:
beide Argumente werden zu kleinstem gemeinsamen
Obertyp promoviert, falls dieser eindeutig ist
(sonst statischer Typfehler)
(Halbordnung →
Was druckt dieses Programm?
Was druckt dieses Programm?
Moral: wenn man nicht auf den ersten Blick sieht,
was ein Programm macht, dann macht es wahrscheinlich
nicht das, was man will.
sieht gleich aus und heißt gleich (cast),
hat aber verschiedene Bedeutungen:
?/: ist ternärer Operator
Anwendung im Ziel einer Zuweisung (C++):
kleiner, größer, gleich,...
Was tut dieses Programm (C? Java?)
(in C gefährlich, in Java ungefährlich--warum?)
Syntax:
Semantik der Zuweisung
Ausdrücke links und rechts werden verschieden behandelt:
(in C-ähnlichen Sprachen)
entsprechend für andere binäre Operatoren
(side effect; falsche Übersetzung: Seiteneffekt)
in C-ähnlichen Sprachen: Zuweisungs-Operatoren
bilden Ausdrücke, d. h. Zuweisungen sind Ausdrücke
und können als Teile von Ausdrücken vorkommen.
Wert einer Zuweisung ist der zugewiesene Wert
Komma-Operator zur Verkettung von Ausdrücken
(mit Nebenwirkungen)
Kritisch: wenn Wert des Ausdrucks
von Auswertungsreihenfolge abhängt:
Sprachstandard (C99, C++) benutzt Begriff
sequence point (Meilenstein):
bei Komma, Fragezeichen,
die Nebenwirkungen zwischen Meilensteinen
müssen unabhängig sein (nicht die gleiche
Speicherstelle betreffen),
ansonsten ist das Verhalten undefiniert
(d.h., der Compiler darf machen, was er will)
vgl. Aussagen zu sequence points in
http://gcc.gnu.org/readings.html
Gurevich, Huggins: Semantics of C,
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.29.6755
(x :: int) + (y :: float)
long x = 1000 * 1000 * 1000 * 1000;
long y = 1000 * 1000;
System.out.println ( x / y );
System.out.println ((int) (char) (byte) -1);
double x = (double) 2 / (double) 3;
List books;
Book b = (Book) books.get (7);
...kommt nur vor, wenn man die falsche Programmiersprache
benutzt (nämlich Java vor 1.5)
Absicht: statt
if ( 0 == x % 2 ) {
x = x / 2;
} else {
x = 3 * x + 1;
}
lieber
x = if ( 0 == x % 2 ) {
x / 2
} else {
3 * x + 1
} ;
historische Notation dafür
x = ( 0 == x % 2 ) ? x / 2 : 3 * x + 1;
(... ? ... : ... )
in C, C++, Java
int main () {
int a = 4; int b = 5; int c = 6;
( c < 7 ? a : b ) = 8;
}
int a = -4; int b = -3; int c = -2;
if (a < b < c) {
printf ("aufsteigend");
}
&&
, ||
oder,
nicht !
, gleich, ungleich, kleiner, ...
&
, |
int [] a = ...; int k = ...;
if ( k >= 0 && a[k] > 7 ) { ... }
(Ü: wie sieht das in Ada aus?)
Erklären durch Verweis auf Java Language Spec.
System.out.println ("H" + "a");
System.out.println ('H' + 'a');
char x = 'X'; int i = 0;
System.out.print (true ? x : 0);
System.out.print (false ? i : x);
:=
, Vergleich =
=
, Vergleich ==
a = b
:
a
b
a += b
++i, --j
:
Wert ist der geänderte
i++, j--
:
Wert ist der vorherige
int a; int b; a = b = 5; // wie geklammert?
for (... ; ... ; i++,j--) { ... }
int a; int b = (a = 5) + (a = 6);
int d = 3; int e = (d++) - (++d);
&&
und ||
int x = 3; int y = ++x + ++x + ++x;