Wirkfunktionen in C
Ein einführendes Beispiel
Die Auswertung eines Aufrufs der Funktion »putchar« liefert in der Regel den Wert des Argument als Ergebnis. Daher ergibt eine Auswertung des Ausdrucks »putchar( 86 )« in der Regel wieder den Wert »86«. Das folgende Programm gibt diesen Wert aus.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( 86 )); }stdout
V86
Die Auswertung des Ausdrucks »putchar( 86 )« hat aber auch noch eine Wirkung, nämlich die Ausgabe des Zeichens 86.
Auf einer C -Implementation sind alle Zeichen durchnumeriert. Welches Zeichen die Nummer 86 hat, hängt vom Rechner ab, auf dem das Programm ausgeführt wird. Wir nehmen hier ein »V« an. Dementsprechend sieht man in der Ausgabe zuerst ein »V«. Die Ausgabe dieses »V« ist die Wirkung der Auswertung des Ausdrucks »putchar( 86 )«.
- Zeichentabelle (Auszug)
Zahl Zeichen
85 U
86 V
87 W
Wirkungen
Dinge können sich im Laufe der Zeit verändern. Man denke beispielsweise an eine Uhr, deren Zeiger ihre Position relativ zum Ziffernblatt verändern.
Wenn wir die Fähigkeit zur Veränderung bei einem Ding betonen wollen, so nennen wir dieses Ding auch ein System. Ein (physikalisches) System ist also ein physikalisches Ding, das grundsätzlich zur Veränderung fähig ist.
Das, was sich bei einem System verändern kann, nennen wir den Zustand (des Systems). Der Zustand einer Uhr ist beispielsweise durch die Positionen ihrer Zeiger gegeben.
Wir sehen manchmal einen bestimmten Eingriff als ursächlich für die Veränderung eines Zustands an und sagen dann, die Veränderung eine Wirkung des Eingriffs sei. Wenn eine Uhr beispielsweise durch Drehen eines außen am Gehäuse angebrachten Rades auf eine andere Zeit umgestellt wird, dann sagen wir, daß die Veränderung der angezeigten Zeit die Wirkung des Drehens sei (vom Drehen bewirkt wurde).
In C kann die Auswertung eines Ausdrucks eine Wirkung haben.
Eine Wirkung wird durch ein Verb (genauer: eine Verbalphrase oder einen Satz) beschrieben, nicht durch ein Substantiv (genauer: eine Nominalphrase).
Die Wirkung einer Auswertung eines Ausdrucks ist jede Veränderung, welche diese Auswertung laut der Dokumentation herbeiführt.
Eine Wirkung muß nicht unbedingt sofort beobachtbar sein, sie kann sich auch versteckt im Inneren des C -Implementation abspielen, es genügt, wenn sie in der Dokumentation beschrieben ist.
Ein Ausdruck, dessen Auswertung eine Wirkung hat, nennen wir Wirkausdruck.
Die Ausgabe als Wirkung
Ein Ausgabe ist eine Wirkung.
Eine Ausgabe ist eine Wirkung, da sie den Zustand der Schreibfläche (des Ausgabegerätes) verändert, sie verändert also einen Zustand.
Die Ausgabe des Numerales 86 in dem obigen Programm gilt nicht als Wirkung der Auswertung des Aufrufausdrucks »putchar( 86 )«, weil sie erst nach dem Abschluß dieser Auswertung durch den Ausdruckrahmen erfolgt. Es handelt sich zwar auch um eine Wirkung, aber sie gehört nicht zu dem Ausdruck »putchar( 86 )«.
Werte und Wirkungen
Die Festlegung eines Rückgabewerts gilt nicht als Wirkung.
Die Auswertung des Ausdrucks »cos( 0 )« hat beispielsweise keine Wirkung, da sie nichts weiter macht als einen Ergebniswert zu ermitteln.
Symbolisch kann man dies mit der folgenden Merkformel festhalten:
Wert ≠ Wirkung
Verhalten
Wirkung und Wert der Auswertung eines Funktionsaufrufausdrucks gemeinsam bezeichnen wir als das Verhalten dieser Auswertung.
Symbolisch kann man dies mit der folgenden Merkformel festhalten:
Verhalten = Wert + Wirkung
Das Verhalten einer Funktion (also das Verhalten der Auswertung eines Aufrufs dieser Funktion) ist in der Dokumentation dieser Funktion beschrieben.
Der Satz „Das Verhalten der Funktion ändert sich nicht.“ bedeutet beispielsweise, daß weder der Wert noch die Wirkung der Funktion sich verändert.
Rückgabe und Ausgabe
Man beachte die unterschiedliche Bedeutung von „Rückgabe“ und „Ausgabe“ sowie von „zurückgeben“ und „ausgeben“: Eine Funktion gibt einen Wert zurück. Eine Ausgabeanweisung gibt einen Wert aus. Die Rückgabe eines Wertes ist ein programminterner Vorgang, der nicht als eine Wirkung angesehen wird. Bei der Ausgabe eines Wertes wird eine Information vom Programm nach außen gegeben, und die Ausgabe wird als Wirkung angesehen.
Daneben gibt es noch das Wort „angeben“: Eine Wertausdruck, der keine Methode ist, gibt seinen Wert an, aber nicht zurück. So gibt der Ausdruck »86« beispielsweise den Wert »86« an. Neben „angeben“ verwendet man aber auch andere Verben dafür. Man sagt beispielsweise auch einfach, daß der Ausdruck »86« den Wert »86« habe.
Auswertung mit bekannter Reihenfolge
In diesem Beispiel zeigen wir die einzelnen Operationen, die während der Auswertung des Ausdrucks »putchar( putchar( 86 )+ 1 )« ausgeführt werden.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( putchar( 86 )+ 1 )); }Protokoll
VW87
- Codierung
83 S
84 T
85 U86 V
87 W
88 X
89 Y- Operation 0 »putchar( 86 )«
- Wert 86
- Wirkung Ausgabe von »V«
- Operation 1 »86 + 1«
- Wert 87
- Operation 2 »putchar( 87 )«
- Wert 87
- Wirkung Ausgabe von »W«
- Auswertung von »putchar( putchar( 86 )+ 1 )« (insgesamt)
- Wert 87
- Wirkung Ausgabe von »VW«
Übungsfragen
? Ausgaben
- Dokumentation der Funktion »putchar« (vereinfacht und übersetzt)
Synopsis
#include <stdio.h>
int putchar( int c );
Schreibt das Zeichen mit der Kennzahl c und
gibt in der Regel den Argumentwert c zurück.
Die Bedeutung des Wortes “schreibt ” stellt klar, daß die Auswertung eines Aufrufs dieser Funktion eine Wirkung hat und nicht nur einen Wert ermittelt.
- ? Ergebnistyp
- Welchen Typ hat ein Aufruf der Funktion »putchar«?
- ? Parametertyp
- Welchen Typ hat der Parameter der Funktion »putchar«?
- ? Wirkung
- Welche Wirkung hat die Auswertung eines Aufrufs der Funktion »putchar«?
? Ausgaben
Für die folgenden Übungsfragen wird die folgende Codierung (Zuordnung von Kennzahlen zu Zeichen) vorausgesetzt.
- Codierung
83 S
84 T
85 U86 V
87 W
88 X
89 Y
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( 86 + 1 )); }
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( 86 )+ 1 ); }
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( 86 + 1 )- 1 ); }
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( putchar( 86 )) ); }
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( putchar( 86 + 1 )- 1 ) ); }
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( putchar( 86 + 1 )- 1 )+ 1 ); }