Ausdrücke

Vgl. Trennung (in Pascal, Ada)

wichtige Spezialfälle für Operatoren:

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: (x :: int) + (y :: float)

beide Argumente werden zu kleinstem gemeinsamen Obertyp promoviert, falls dieser eindeutig ist (sonst statischer Typfehler)

(Halbordnung Halbverband)

Was druckt dieses Programm?

long x = 1000 * 1000 * 1000 * 1000;
long y = 1000 * 1000;
System.out.println ( x / y );

Was druckt dieses Programm?

System.out.println ((int) (char) (byte) -1);

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:

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;

?/: ist ternärer Operator

(... ? ... : ... ) in C, C++, Java

Anwendung im Ziel einer Zuweisung (C++):

int main () {
    int a = 4; int b = 5; int c = 6;
    ( c < 7 ? a : b ) = 8;
}

kleiner, größer, gleich,...

Was tut dieses Programm (C? Java?)

int a = -4; int b = -3; int c = -2;
if (a < b < c) {
    printf ("aufsteigend");
}

Erklären durch Verweis auf Java Language Spec.

Syntax:

Semantik der Zuweisung a = b:

Ausdrücke links und rechts werden verschieden behandelt:

(in C-ähnlichen Sprachen)

(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

int a; int b; a = b = 5; // wie geklammert?

Komma-Operator zur Verkettung von Ausdrücken (mit Nebenwirkungen)

for (... ; ... ; i++,j--) { ... }

Kritisch: wenn Wert des Ausdrucks von Auswertungsreihenfolge abhängt:

int a; int b = (a = 5) + (a = 6);
int d = 3; int e = (d++) - (++d);

Sprachstandard (C99, C++) benutzt Begriff sequence point (Meilenstein):

bei Komma, Fragezeichen, && und ||


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)

int x = 3; int y = ++x + ++x + ++x;


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

2015-08-17