\begin{slide}{Ausdrücke mit Nebenwirkungen}

(\emph{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
\begin{verbatim}
int a; int b; a = b = 5; // wie geklammert?
\end{verbatim}

Komma-Operator zur Verkettung von Ausdrücken
(mit Nebenwirkungen)
\begin{verbatim}
for (... ; ... ; i++,j--) { ... }
\end{verbatim}


\end{slide}

\begin{slide}{Auswertungsreihenfolgen}

Kritisch: wenn Wert des Ausdrucks 
von Auswertungsreihenfolge abhängt:
\begin{verbatim}
int a; int b = (a = 5) + (a = 6);
int d = 3; int e = (d++) - (++d); 
\end{verbatim}
\begin{itemize}
  \item keine Nebenwirkungen: egal
  \item mit Nebenwirkungen:
    \begin{itemize}
    \item C, C++: Reihenfolge nicht spezifiziert,
      wenn Wert davon abhängt, dann ist Verhalten
      \emph{nicht definiert}
    \item Java, C\#: Reihenfolge genau spezifiziert
      (siehe JLS)
    \end{itemize}
  \end{itemize}

\end{slide}


\begin{slide}{Auswertungsreihenfolge in C}

Sprachstandard (C99, C++) benutzt Begriff
\emph{sequence point} (Meilenstein):

bei Komma, Fragezeichen, \verb|&&| und \verb+||+

\bigskip

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)

\verb|int x = 3; int y = ++x + ++x + ++x;|
\bigskip

vgl. Aussagen zu sequence points in
\url{http://gcc.gnu.org/readings.html}

Gurevich, Huggins: Semantics of C,
\url{http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.29.6755}

\end{slide}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "~/edu/ws06/pps/folien/pps"
%%% End: 
