Argumente in C
Einführendes Beispiel
main.c
#include <stdio.h>
#include <math.h>int main( void )
{ printf
( "%g\n", floor( 2.7 ) ); }stdout
2.0
Wir sehen in dem obigen Programm eine neue Möglichkeit zum Schreiben eines Aufrufausdrucks : Die runden Aufrufklammern müssen nicht immer leer sein, sie können auch einen Ausdruck enthalten!
Aufrufausdruck (Syntaxdiagramm)
Aufrufausdruck
.-------------------.
.---------------. .-. | .----------. v .-.
--->| Funktionsname |--->( ( )---'--->| Ausdruck |---'--->( ) )--->
'---------------' '-' '----------' '-'
Der Boden (die Abrundung, englisch “floor ”) einer Zahl ist die größte ganze Zahl, welche nicht größer als die Zahl ist. So haben die Zahlen 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8 und 2.9 beispielsweise alle den Boden 2.0.
Der Typ eines Aufrufsausdrucks zur Funktion »floor« ist »double«, der Typ des Argumentausdrucks kann ebenfalls »double« sein.
Ein Beispiel für Aufrufklammern mit einem Inhalt findet man im Aufrufausdruck »floor( 2.7 )« (d.h., Ermittlung des „Bodens“ von »2.7«): Hier ist »floor« der Funktionsname und »2.7« ein in den Klammern enthaltener Ausdruck.
Der Wert des Aufrufs kann durch jenen Wert in den Klammern mitbestimmt sein.
main.c
#include <stdio.h>
#include <math.h>int main( void )
{ printf
( "%g\n", floor( 2.7 ) ); }stdout
2.0
main.c
#include <stdio.h>
#include <math.h>int main( void )
{ printf
( "%g\n", floor( 3.7 ) ); }stdout
3.0
main.c
#include <stdio.h>
#include <math.h>int main( void )
{ printf
( "%g\n", floor( 2.7 ) ); }stdout
2.0
Ein in die Aufrufklammern geschriebener Ausdruck wird auch Argumentausdruck des Aufrufs oder kurz Argumentausdruck genannt. Die Aufrufklammern, welche das Argument enthalten, werden entsprechend hier auch manchmal als Argumentklammern bezeichnet. Der Wert des Argumentausdruck ist der Argumentwert. Wenn es nicht wichtig ist zwischen dem Argumentausdruck und Argumentwert zu unterscheiden, so spricht am auch einfach nur von einem Argument. Dann muß dem Zusammenhang entnommen werden, ob damit der Argumentausdruck oder der Argumentwert gemeint ist – manchmal sind auch beide Interpretationen gleichzeitig möglich.
Der Argumentausdruck in einem Aufrufausdruck entspricht dem Operandenausdruck eines Operatorausdrucks. Der Sinn ist derselbe, nur spricht man bei einem Aufrufausdruck eben von einem Argumentausdruck und nicht von einem Operandenausdruck. Beispielsweise entspräche dem Operatorausdruck »-2« der Aufrufausdruck »minus( 2 )«, wenn es eine Funktion »minus« gäbe.
Man kann sich den Sinn eines Arguments auch so erklären: Das Programm (die Funktion) »floor« benötigt noch Informationen, um seine Arbeit tun zu können, und diese Informationen werden durch den Wert des Arguments geliefert. Das Argument enthält Informationen, welche die Funktion verarbeiten soll.
Übergabe des Argumentwerts
Da beim Aufruf einer Funktion der Wert des Argumentausdrucks zur Laufzeit zusammen mit der Kontrolle an die aufgerufene Funktion übergeben wird, spricht man auch von der Übergabe des Argumentwertes oder sagt, der Argumentwert werde an die aufgerufene Funktion übergeben.
- »main« und »floor« bei »floor( 2.7 )«
.--------------------------------------------.
| main ------------. |
| | Übergabe der Kontrolle |
| V und des Wertes 2,7 |
| .---------------. |
| | floor | |
| '---------------' |
| | |
| | |
|<-----------------' |
| Rueckgabe der Kontrolle |
| und des Wertes 2,0 |
| |
'--------------------------------------------'- Übergabe und Rückgabe der Kontrolle zur Laufzeit
.--------------------------------------------.
| Hauptprogramm----. |
| | Übergabe der Kontrolle |
| V und eines eventuellen |
| .---------------. Argumentwertes |
| | Unterprogramm | |
| '---------------' |
| | |
| | |
|<-----------------' |
| Rueckgabe der Kontrolle |
| und eines eventuellen Ergebnisses |
| |
'--------------------------------------------'
Semantik eines Argumentwertes
Die Bedeutung eines bestimmten Argumentwertes für die Auswertung des Aufrufausdrucks wird durch die Dokumentation der aufgerufenen Funktion festgelegt.
Aussprache eines Aufrufausdrucks
Die runde Klammer auf »(« wird im Deutschen meist als „von“ gesprochen. So ist »floor( 2.7 )« „floor von Zwei Komma Sieben“ oder „der Boden von Zwei Komma Sieben“. Den Ausdruck »cos( 0 )« kann man als „Kosinus von Null“ aussprechen.
Ausführlicher nennt man »cos( 0 )« „der Aufruf der Methode »cos« mit dem Argument(wert) »0«“.
Man kann sich den Aufruf »floor( 2.7 )« auch als Frage veranschaulichen: „Was ist der Boden von 2,7?“ – er antwortet dann mit „2“.
Weitere Beispiele
Das folgende Programm zeigt die Berechnung des Sinus von 2 in C.
main.c
#include <stdio.h>
#include <math.h>int main( void )
{ printf
( "%g\n", sin( 2 ) ); }stdout
0.909297
Der Typ eines Aufrufsausdrucks zur Funktion »sin« ist »double«, der Typ des Argumentausdrucks kann ebenfalls »double« sein.
Operationen
In diesem Beispiel zeigen wir die einzelnen Operationen, die während der Auswertung des Ausdrucks »sqrt( rand() / 2. )« ausgeführt werden.
- Der Beispielausdruck
sqrt( rand() / 2. )
Hier wird angenommen, daß in der Quelldatei die für die Verwendung dieser Funktionen benötigten Direktiven »#include <stdlib.h>« und »#include <math.h>« am Anfang des Quelltextes richtig verwendet wurden.
Bevor die erste Funktion »sqrt« (“squareroot ”, „Quadratwurzel“) ausgeführt werden kann, muß zunächst der Wert des Arguments »rand() / 2.« ermittelt werden.
Eine Auswertung eines Ausdrucks erfolgt in verschiedenen Schritten. Zu jedem Operator und zu jeder Funktion gehört ein Schritt, der meist einer Funktion oder einem Operator entspricht. Wir nennen diese Schritte hier Operationen.
Operation 0 »rand«
Der Wert von »rand()« wird erst bei der Auswertung bestimmt und ist hier nicht bekannt. Wir nehmen hier an, daß der Wert von »rand()« gleich »41« ist. (Dies wurde bei einem konkreten Test auch so beobachtet.)
- Funktionsoperation »rand()«
sqrt( rand() / 2. ) →
sqrt( 41 / 2. )
Operation 1 » /«
Nachdem nun die Werte der beiden Operanden bekannt sind, kann die Division ausgeführt werden.
- Operatoroperation »41 / 2.«
sqrt( 41 / 2. ) →
sqrt( 20.5 )
Operation 2 » sqrt«
Nun ist der Wert des Arguments der Funktion »sqrt« ermittelt worden. Damit kann diese Funktion dann mit dem Argumentwert verbunden werden, und diese Verbindung kann dann ausgeführt werden, um schließlich den Wert des gesamten Ausdrucks zu erhalten.
Der Typ eines Aufrufsausdrucks zur Funktion »sin« ist »double«, der Typ des Argumentausdrucks kann ebenfalls »double« sein.
- Funktionsoperation »sqrt( 20.5 )«
sqrt( 20.5 ) →
4.527692569068708650092958123423159122467041015625
Die hier sichtbaren vielen Stellen spiegeln den Wert des Ausdrucks unter der verwendeten Implementation genau dar, werden aber normalerweise bei der Ausgabe des Wertes nicht alle angezeigt.
Operationen, Zusammenfassung
Wir haben gesehen, daß während der Auswertung eines Ausdrucks zu jedem in dem Ausdruck verwendeten Funktionsnamen und Operator eine Operation ausgeführt wird. Die Operationen sind die einzelnen Schritte bei der Auswertung eines Ausdrucks. Sie werden zeitlich nicht unbedingt in derselben Reihenfolge hintereinander ausgeführt, in welcher ihre Funktionsnamen oder Operatoren im Quelltext vorkommen.
Programmbeispiel
Das folgenden Programmbeispiel zeigt, wie der eben behandelte Ausdruck in einem vollständigen C -Programm verwendet werden kann. Darunter findet sich ein beispielhafte Ausgabe, die aber bei einem Lauf des Programms auch anders sein kann.
main.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>int main( void )
{ printf
( "%g\n", sqrt( rand() / 2. )); }stdout
4.52769
Übungsfragen
? Ausdrücke lesen (0)
Was ist der Argumentausdruck in dem Aufrufausdruck »floor( 3.2 )«?
Welchen Wert hat der Aufrufausdruck »floor( 3.2 )«?
Welchen Typ hat der Aufrufausdruck »floor( 3.2 )«?
Erklärung zur Bedeutung von Ausdrücken *
Wir hatte Ausdrücke bereits als Texte kennengelernt, welche man in den Ausdruckrahmen einsetzen kann. Danach konnten wir Ausdrücke auch als das charakterisieren, was man als Operand eines Operators schreiben kann. Nun können wir Ausdrücke auch noch dadurch charakterisieren, daß sie als Argumente in Aufrufausdrücken verwendet werden können.
Abbildungsfunktionen *
Eine Funktion, welche man mit einem Argument aufrufen kann, und welche einen Wert als Ergebnis liefert, der durch diese Funktion und den Argumentwert bestimmt ist, kann als eine Abbildung im Sinne der Mathematik interpretiert werden. floor ist ein Beispiel für solch eine Funktion.
Im Gegensatz dazu ist »rand()« beispielsweise keine Abbildungsfunktion, da sie kein Argument hat und auch ihr Wert nicht eindeutig durch den Aufrufausdruck bestimmt ist.