News Ticker

C 3: Das erste Programm

Nach etwas Theorie in den ersten beiden Artikeln, soll es nun an die Praxis gehen. Angemerkt sei, dass sich Theorie und Praxis schwierig auseinander halten lassen. Es gibt also keinen reinen praktischen und keinen reinen theoretischen Teil. In diesem Artikel soll das so ziemlich einfachste Programme, welches Programmieranfänger jeder Sprache seit Brian Kernighan als erstes lernen müssen, Hallo Welt schreiben. Das ist nicht spektakulär, jedoch werden ein paar tolle Prinzipien erklärt.

Als allererstes das Listing selbst:

#include <stdio.h>
 
int main(void)
{
   printf("Hallo Welt!\n");
   return 0;
}

Dies schreibt ihr mit eurem Editor in eine Datei und speichert sie als z.B. hallo.c. Den Namen könnt ihr natürlich frei wählen. Nun ein paar Erklärungen und Anmerkungen.

  • Die Einrückungen sind wirkungslos. Das Programm kann genauso gut auf einer Zeile stehen. Sie dienen nur dem besseren Lesen.
  • Alle Befehle mit einem # am Anfang gehen an den Präprozessor. Wie der Name sagt, wird der Text präprozessiert bevor er an den Compiler weitergegeben wird (mehr dazu später). Wieso braucht man das? Wir möchten Text auf der Konsole ausgeben. Da C jedoch eine sehr minimalistische Sprache ist, können wir das nicht einfach so machen. Wir benötigen Code, der von anderen geschrieben, uns zur Verfügung steht und das erledigt…oder wir schreiben eine eigene Funktion, die jedes Pixel auf dem Bildschirm setzt. Das erste klingt und ist viel einfacher. Deswegen „inkludieren“ wir diesen Code. Das heißt in der Praxis, dass der Präprozessor die ganze Datei (in diesem Fall stdio.h) in unsere Datei einfügt bevor der Code kompiliert wird.
  • Die nächste Zeile zeigt uns eine Funktion. Um genauer zu sein: die Main-Funktion. Sie ist vom Typ int. Das bedeutet, dass sie einen Integer, eine ganze Zahl, an den, der sie aufruft zurück gibt. Das wird dazu benutzt, um zu überprüfen und zu signalisieren, ob die Funktion richtig ausgeführt worden ist. Typischerweise wird eine 0 oder eine andere positive Zahl zurückgegeben wenn alles glatt lief. Negative Zahlen sind dagegen nichts gutes. 😉 Funktionen dürfen normalerweise fast jeden Namen haben, nur die Main-Funktion nicht. Es gibt nur eine in jedem Programm – und diese wird als erstes ausgeführt. Alle anderen Funktionen müssen also von dieser aufgerufen werden. Dass es sich um eine Funktion handelt, erkennt man an den einfachen Klammern nach dem Namen (und natürlich an dem Namen selbst, nichts anderes darf main heißen!). Funktionen können mit Argumenten aufgerufen werden. Wenn man das nicht wünscht, lässt man die Argumente (nicht die Klammern) einfach weg oder schreibt void zwischen die Klammern.
  • Die geschweiften Klammern fassen einen Block zusammen. Das heißt: alles zwischen diesen Klammern gehört logisch zur Main-Funktion.
  • printf(), wie man sieht, ist eine Funktion. Wenn man eine Funktion benutzt, braucht man logischerweise keinen Rückgabewerttypen zu definieren. Man benutzt die Funktion ja nur. Die Main-Funktion dagegen wurde von uns erstellt. Deswegen müssen wir den Rückgabewerttypen definieren. Das Argument zu printf() ist ein String – also eine Zeichenkette. Diese wird auf der Konsole ausgegeben werden. Das \n am Ende sorgt für einen Zeilenumbruch (engl.: newline, dt.: Neuzeile). Mehr zu Kontrollsequenzen gibt es in einem späterem Artikel.
  • Jede Zeile außer Präprozessor-Kommandos und Zeilen vor einem Blockanfang (also z.B. die Main-Funktions-Definition) müssen mit einem Semikolon beendet werden.
  • return 0 gibt, wie oben beschrieben 0 an die aufrufende Instanz zurück. In diesem Fall ist das das Betriebssystem, welches dann weiss, dass unser Programm erfolgreich beendet worden ist.

Das war allerhand Theorie. Damit diese nicht Überhand nimmt, jetzt etwas Praxis. Ich gehe davon aus, dass Linux als Betriebssystem benutzt wird, da es einfach wie geschaffen zum Programmieren ist. In einer Konsole/einem Terminal wechselt man jetzt in das Verzeichnis, in dem die Datei hallo.c liegt. Nun kompilieren und starten wir das Programm:

tcr@triton ~ $ gcc hallo.c
tcr@triton ~ $ ./a.out
Hallo Welt!
tcr@triton ~ $

Soviel mehr über den Compiler wird in diesem Artikel nicht erwähnt, da dieser schon lang genug ist 😉 Gesagt sei jedoch: gcc ist der Präprozessor, Compiler und Linker in einem. Wir brauchen also nur diesen Befehl und alles andere wird automatisch erledigt. Es wird eine ausführbare Datei namens a.out erstellt, welche danach auch ausgeführt wird. Sie gibt „Hallo Welt!“ aus und beendet sich.

PS: Unter Windows muss das Programm von der Eingabeaufforderung ausgeführt werden, da das Programm sonst zu schnell ausgeführt wird, sich beendet und man nicht sieht was denn ausgegeben wurde. Alternativ kann auch eine neue Zeile nach dem printf()-Aufruf eingefügt werden: getchar();. Diese wartet darauf, dass eine Taste gedrückt wird und beendet sich erst dann.