void greet()
{
printf( “Hello ” );
printf( “World!\n” );
}
int main()
{
greet();
return 0;
}
void greet()
{
printf( “Hello ” );
printf( “World!\n” );
}
int main()
{
greet();
return 0;
}
Was sehen wir hier? Nun, zuerst einmal eine neue Funktion greet
mit dem Rückgabetyp void
; dieser besagt, dass unsere Funktion einfach keinen Wert zurückgibt – muss sie auch nicht, sie soll uns nur grüßen. Der Funktionsrumpf besteht aus 2 Aufrufen der printf
-Funktion, einfach mit aufgeteiltem String. Zusätzlich wurde in der main
-Funktion der Aufruf von printf
durch den Aufruf der neuen greet
-Funktion ersetzt.
So weit, so einfach (hoffe ich). Aufmerksamen Lesern dürften nun aber ein paar Sachen aufgefallen sein, die ich bisher verschwiegen habe.
Als erstes wäre da die Frage, woher die Funktion printf
überhuapt herkommt, und was diese ominöse erste Zeile bewirkt:
#include <cstdio>
Beides hängt zusammen; printf
ist eine Funktion der sogenannten Standardbibliothek von C++. Die Standardbibliothek einer Programmiersprache ist eine Sammlung von unter anderem verschiedenen Funktionen für alle möglichen allgemeinen Zwecke; printf
entstammt nun genau aus dieser. Deklariert1 ist diese Funktion in der Datei cstdio
(zusammen mit vielen anderen Funktionen), welche mit der Zeile #include <cstdio>
in die aktuelle Datei eingebunden wird (der Compiler weiß selber, wo er diese Datei suchen muss, deswegen klappt das). Damit wird dem Compiler die Funktion printf
also bekannt gemacht und wir können sie problemlos aufrufen.
1 Über den Unterschied zwischen Deklaration und Definition schreibe ich ein andermal.
Eine weitere auftauchende Frage könnte sein, was das \n
am Ende des Hello World!
-Stringes zu bedeuten hat. \n
ist eine sogenannte Escape-Sequenz; das sind kurze Zeichenketten, die besondere Symbole darstellen. \n
ist dabei das Zeichen für den Zeilenumbruch, da wir am Ende unseres Strings einen solchen haben wollen, ihn aber nicht einfach in den String schreiben können (das verbietet C++). Der folgende Code ist also ungültig:
void greet() { printf( "Hello World! " ); }
Escape-Sequenzen beginnen immer mit einem Backslash, gefolgt von (meist) einem oder mehreren Buchstaben, Symbolen oder Ziffern, welche die genaue Escape-Sequenz beschreiben. Das bringt natürlich sofort die Frage mit sich, wie man denn dann einen normalen Backslash innerhalb eines Strings darstellt – das geschieht wiederum über eine Escape-Sequenz, und zwar per Doppelbackslash: \\
Eine letzte wichtige Frage ist noch offen: woher weiß das Programm, dass es gerade bei der main
-Funktion anfangen soll, und warum liefert die eigentlich eine ganze Zahl zurück? Beides ist Konvention; in der Standardeinstellung verlangen alle Compiler in einem zu kompilierenden Programm eine Funktion mit dem Namen main
, welche als sogenannter Einsprungpunkt der Anwendung genutzt wird, sprich, welche automatisch bei Programmstart als erstes aufgerufen wird. Dass die main
-Funktion eine ganze Zahl als Rückgabewert erwartet, ist ebenfalls Konvention. Früher wurde damit häufig angegeben, ob eine Anwendung erfolgreich beendet wurde oder ob ein Fehler auftrat – die zurückgegebene Zahl gab einen Hinweis auf den Fehler. Moderne Compiler akzeptieren aber auch eine main-Funktion ohne Rückgabewert, sprich mit der Signatur void main()
und dann ohne die Zeile return 0;
.
Das war der erste Artikel zum Thema Funktionen. Fragen wie immer in die Kommentare oder (bei speziellen Fragen) gern auch per Mail. Im nächsten Artikel wird es dann (vermutlich) um das zweite wichtige Konzept von Programmiersprachen gehen, nämlich die Variablen. Seid gespannt!
Kommentare (28)