Argumente in C (Argumente in C), Lektion, Seite 722926
https://www.purl.org/stefan_ram/pub/argumente_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C-Kurs

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.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722926 stefan_ram:722926 Argumente in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722926, slrprddef722926, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/argumente_c