Im ersten Artikel zum Thema Programmierung ging es um die allgemeine Entwicklungsumgebung, sprich: was wird überhaupt benötigt, um zu programmieren. Heute wollen wir auch schon direkt mit Programmieren anfangen und dabei eines der zentralen Konzepte der meisten Programmiersprachen besprechen: die Funktionen.
Ein Hinweis vorab: ich werde Programmcode ausnahmslos in Englisch schreiben, ganz einfach, weil das in weiten Teilen der Informatik (und insbesondere der Forschung) weit verbreitet ist und sich meiner Meinung nach aus Kommunikationsgründen auch so gehört (unter anderem auch, da die meisten Programmiersprachen ohnehin englische Begriffe verwenden).
Fangen wir mit ein wenig technischem Hintergrund an. Funktionen bilden den zentralen Kern der meisten Programmiersprachen, da über sie der Programmfluss gesteuert wird. In einem früheren Artikel hatte ich schon einmal beschrieben, wie Rechner ungefähr arbeiten. Grob gesagt funktioniert das folgendermaßen: die auszuführenden Anweisungen stehen, gespeichert als Binärzahlen (der Rechner weiß, wie er die Zahlen interpretieren muss), im Programmspeicher des Rechners, und zwar in sogenannten Speicherzellen; zusammengehörige Anweisungen stehen dabei in der Regel auch hintereinander. Jede Speicherzelle hat eine bestimmte Adresse (eine einfache Zahl), über die sie identifiziert werden kann. Zusätzlich speichert der Rechner im Program Counter (PC) die Adresse der nächsten auszuführenden Anweisung.
Über die Modifikation des PCs kann also gesteuert werden, welche Anweisung als nächstes ausgeführt werden soll – man spricht von der Steuerung des Programmflusses. Eine Funktion ist allgemein gesagt eine Folge zusammengehöriger Anweisungen, die hintereinander im Programmspeicher ab einer bestimmten Adresse stehen. Ein Funktionsaufruf ist – technisch gesehen – das setzen des PCs auf die Startadresse der aufgerufenen Funktion mit anschließender Ausführung der zur Funktion gehörenden Anweisungen und danach erfolgendem Rücksprung an die Stelle vor dem Aufruf.
Klingt kompliziert? Schauen wir uns das einmal an einem konkreten Beispiel an. Rufen wir uns zuerst noch einmal den Code aus dem letzten Artikel ins Gedächtnis:
#include <cstdio> int main() { printf( "Hello World!\n" ); return 0; }
Die erste Zeile ignorieren wir erst einmal. Interessant wird es hier:
In dieser Zeile sehen wir die Definition einer Funktion, die in diesem Fall den Namen main
trägt (zu dem Namen gleich noch etwas). Das ominöse int
ist der Rückgabewert der Funktion; er besagt in diesem Fall, dass die Funktion eine ganze Zahl “berechnet” (im weitesten Sinne; int
ist die Abkürzung für “integer”, englisch für ganze Zahl) und als Ergebnis zurückliefert – ganz so, wie man es aus der Mathematik kennt, wo etwa die mathematische Funktion f(x) = x²
das Quadrat eines gegebenen Parameters (zum Thema Parameter kommen wir in einem der folgenden Artikel) berechnet. Die leeren Klammern hinter main
besagen, dass die Funktion keine Argumente erwartet (dazu gleich noch etwas). Insgesamt nennt man eine solche Definition Funktionskopf oder Funktionssignatur.
Auf die Signatur folgt für gewöhnlich der Funktionsrumpf; dieser fasst in geschweiften Klammern die Anweisungen beziehungsweise Statements zusammen, die beim Aufruf der entsprechenden Funktion ausgeführt werden sollen. In unserem Fall sind das die folgenden beiden Zeilen:
printf( "Hello World!\n" ); return 0;
Die erste Anweisung ist einer der bereits erwähnten Funktionsaufrufe. Hier wird die Funktion printf
aufgerufen, die dafür sorgt, dass Text auf dem Bildschirm ausgegeben wird; die Funktion erwartet (mindestens) ein Argument, also einen übergebenen Wert, der den auszugebenden Text beschreibt, in unserem Fall "Hello World!\n"
. "Hello World!\n"
ist ein sogenannter String (oder deutsch: eine Zeichenkette), also eine beliebige Folge von Zeichen.
Die zweite Anweisung ist eine sogenannte return
-Anweisung, mit welcher gesagt wird, welchen Ergebniswert eine Funktion zurückgeben soll; in unserem Fall ist das einfach der Wert 0.
Um das Konzept des Funktionsaufrufes und der Funktionsdefinition besser zu verstehen, wollen wir unseren Code etwas ändern. Anstatt einer einzelnen Anweisung printf( "Hello World!\n" );
wollen wir das Ganze in eine separate Funktionen auslagern. Wir schreiben also den folgenden Code:
#include <cstdio>
Kommentare (28)