Einführung in Wertdienste im Rahmen der Lehre der Programmiersprache C++.ß [] (C++ Funktion Funktionsaufruf), Lektion, Seite 721573
http://www.purl.org/stefan_ram/pub/c++-wertdienst ist die kanonische URI dieser Seite.
Stefan Ram

Wertdienste in C++

Ein Literal ist ein Name für einen Wert.

Die Programmiersprache C++  erlaubt es auch, Werte anzugeben, die zur Laufzeit (bei Ausführung des Programms) von benannten Diensten ermittelt werden.

Der Name eines Dienstes steht aber für diesen Dienst selber. Um den vom Dienst ermittelten Wert  zu bezeichnen muß daher eine andere Schreibweise verwendet werden: Dem Namen des Dienstes wird ein Paar runder Klammern nachgestellt.

In dem folgenden Programm bezeichnet der Text "::std::rand" einen Dienst und "::std::rand()" den Wert einer Aktivierung dieses Dienstes.

rand.cpp
#include <iostream> 
#include <ostream> 
#include <cstdlib>
int main() 
{ ::std::cout << ::std::rand() << "\n"; }

::std::cout
41

Der Wert eines Literals ist durch den Text des Literals unveränderlich festgelegt und damit bereits bekannt, wenn der Quelltext bekannt ist. Beim Wert einer Dienstaktivierung ist es hingegen möglich, daß dieser erst spät, nämlich während einer Ausführung des Programms, ermittelt wird. Daher kann man durch bloßes Lesen des Quelltextes nicht vorhersagen, welchen Wert der Quelltext "::std::rand()" hat.

Der Dienst "::std::rand" wird in C++  auch eine Funktion  genannt. Allerdings handelt es sich bei dieser Funktion nicht um eine Funktion im mathematischen Sinne des Wortes. Die Beschreibung "::std::rand()" beschreibt einen Wert unter Verwendung dieser Funktion. Solch eine Beschreibung mit einer einem Paar von Klammern vorangestellten Funktion wird auch eine Anwendung dieser Funktion  oder ein Aufruf dieser Funktion  genannt. Solch einen Wert kann man auch einen Dienstwert  nennen, weil es ein von einem Dienst ermittelter Wert ist.

Die Funktion "::std::rand" ist in C++  standardmäßig verfügbar und wird daher auch als eine Standardfunktion  bezeichnet. Die Sammlung solcher Standardfunktionen wird auch Standardbibliothek  genannt.

::std::rand

Der Wert eines Aufrufs der Standardfunktion "::std::rand" ist vom Datentyp "int". Er ist eine im Rahmen des Aufrufs ermittelte sogenannte Pseudozufallszahl. Das wird auch durch das folgende Kompaßdiagramm  ausgedrückt.

::std::rand [Kompassdiagramm]
.---------------------. 
| ::std::rand | int 
| |------------------->  
| | Pseudozufallszahl 
'---------------------'

Wenn in einem Programm die Standardfunktion "::std::rand" verwendet wird, ist die Zeile "#include <cstdlib>" am Anfang der Übersetzungseinheit nötig.

Der Wert eines Aufrufs der Funktion "::std::rand" ist eine ganzzahlige Pseudozufallszahl aus dem Bereich von Null bis zum Wert "RAND_MAX". Das Wort "RAND_MAX" ist ein Ausdruck und steht für einen bestimmten ganzzahligen Wert, der mindestens der Wert "32767" ist. Damit dieses Wort im Programm mit dieser Bedeutung verwendet werden kann, ist die Zeile "#include <cstdlib>" am Anfang der Übersetzungseinheit nötig.

Es kann sein, daß dieses Programm auch dann funktioniert, wenn einige Kopfdirektiven nicht verwendet werden. Das wird aber in diesem Fall nicht mehr von der Programmiersprache garantiert. Deswegen sollten die richtigen Kopfdirektiven immer verwendet werden, auch wenn manche Programm unter manchen Umständen sonst auch funktionieren.

Es ist möglich, daß das Programm bei jedem Lauf, die gleiche  Zahl ausgibt. Dies ist enttäuschend, wenn man unvorhersehbaren Zufallszahlen erwartet, doch wird in späteren Lektionen gezeigt werden, wie dieses Verhalten verändert werden kann.

Aufrufsyntax

Es folgt eine vereinfachte Variante der Aufrufsyntax  von C++ : Ein Funktionsaufruf ist in C++  eine sogenannte postfix-expression  (d.h. eine bestimmte Form eines Ausdrucks), die gebildet werden kann, indem hinter eine andere postfix-expression  eine öffnende und eine schließende runde Klammer geschrieben wird. Das Entscheidende an dieser Schreibweise sind die runden Klammern nach einem Ausdruck, mit denen man also den Aufruf kennzeichnet. Der Ausdruck "::std::rand" ohne  die runden Klammern ist eine Funktion, der Ausdruck "::std::rand()" mit  den runden Klammern ist ein Aufruf  dieser Funktion.

postfix-expression 〉 ::=
postfix-expression 〉 "(" ")".

Einklammern der Funktion

Daß eine Funktion alleine ebenfalls einen Ausdruck darstellt, kann man auch daran erkennen, daß man sie einklammern kann. Das ist bei Ausdrücken immer möglich, ohne daß sich an ihrer Bedeutung etwas ändert.

rand1.cpp
#include <iostream> 
#include <ostream> 
#include <cstdlib>
int main() 
{ ::std::cout <<( ::std::rand )() << "\n"; }

::std::cout
41

Verwendung der Funktion ohne Aufruf

Das folgende Programmbeispiel gibt einen Wert aus, der die Funktion "::std::rand" selber  repräsentiert, jedoch nicht den Wert eines Aufrufs  dieser Funktion. Es handelt sich bei der Ausgabe also auch nicht um eine Pseudozufallszahl (was man ihr aber nicht unbedingt ansieht). Da die Verwendung einer Funktion in C++  auch ohne Aufrufoperator erlaubt ist, aber etwas anderes bedeutet als ein Aufruf der Funktion, muß der Programmierer in C++  selber darauf achten, den Aufrufoperator zu verwenden, wenn ein Aufruf erfolgen soll.

rand2.cpp
#include <iostream> 
#include <ostream> 
#include <cstdlib>
int main() 
{ ::std::cout << ::std::rand << "\n"; }

::std::cout
00420720

Übungsaufgaben

RAND_MAX

Geben Sie den Wert des Ausdrucks "RAND_MAX" (nach Verwendung der Kopfdirektive "#include <cstdlib>") aus.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Von der Stefan-Ram-Startseite ausgehend finden sich oft noch mehr Informationen zu Themen, die auf einer Seite angesprochen wurden. (Eine Verbindung zur Stefan-Ram-Startseite befindet sich ganz oben auf dieser Seite.)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. slrprd, PbclevtugFgrsnaEnz