2 Erste Schritte in C
In diesem Kapitel unternehmen Sie die ersten Schritte in C. Sie schreiben Ihr erstes Programm und erfahren, was alles zu seinem Grundgerüst gehört. Des Weiteren lernen Sie schon einmal die Möglichkeiten kennen, in C etwas auf dem Bildschirm auszugeben.
2.1 Das erste Programm in C
Ihr erstes Programm wird einfach einen Text auf dem Bildschirm ausgeben. Tippen Sie den nachfolgenden C-Quellcode in einen Text-Editor Ihrer Wahl (oder in eine Entwicklungsumgebung oder einen ASCII-Editor) ein. Übersetzen Sie das Programm und bringen Sie es zur Ausführung.
00 // Kapitel2/erstes_programm.c
01 #include <stdio.h>
02 int main(void) {
03 printf("Hallo Welt\n");
04 return 0;
05 }
Geschafft? Dann haben Sie jetzt ein »Hallo Welt« auf der Konsole – wie es schließlich in fast jedem Programmierbuch Pflicht ist –, und das erste Programm läuft.
Übersichtliche Schreibweise
Wir empfehlen Ihnen, von Anfang an darauf zu achten, den Code, der zwischen geschweiften Klammern (in sogenannten Anweisungsblöcken) steht, mit der Tabulatortaste einzurücken. So gewöhnen Sie sich eine übersichtliche Schreibweise an, die Ihnen in Zukunft viel Frust ersparen wird.
Wir haben übrigens nicht zufällig ein Programm gewählt, das ohne Tastatureingabe auskommt. Die Eingabe von Zeichenketten ist nämlich in C nicht ganz trivial und erfordert ein wenig Wissen über Speicheradressen. Später, wenn wir in Kapitel 9, »Arrays und Zeichenketten (Strings)«, darauf eingehen, wird Ihnen das keine Schwierigkeiten mehr bereiten.
Zeilennummern im Buch
C verwendet keine Zeilennummern. Wir fügen in diesem Buch trotzdem der Übersicht halber welche hinzu. Beim Abtippen lassen Sie sie also weg.
Schauen wir uns nun das vorige Listing genauer an. Sie haben damit schon ein komplettes Grundgerüst für ein C-Programm vor sich:
Zeile (00) ist lediglich ein Kommentar und wird beim Übersetzen des Programms verworfen. In Zeile (01) finden Sie mit #include einen Befehl für den Präprozessor. Der Präprozessor ist Teil des Compilers – oder genauer: ein Programm, das vor dem ersten Compiler-Durchlauf ausgeführt wird. Mit dem Präprozessor-Befehl #include bestimmen Sie in Zeile (01), dass eine für unser Listing nötige Bibliothek eingebunden werden soll, nämlich die Datei stdio.h. Entfernen Sie diese Zeile, bekommen Sie eine Fehlermeldung, die besagt, dass die Funktion printf() nicht bekannt ist, die in Zeile (03) verwendet wird. Der Compiler kann also mit der Funktion printf() nichts anfangen, wenn die Header-Datei stdio.h nicht mit einkopiert wurde.
In Zeile (02) definieren Sie mit main() die Hauptfunktion des Programms. Jedes ausführbare Programm benötigt eine solche main()-Funktion. Diese ist der Einsprungspunkt (engl. program startup). Jedes Programm besteht im Endeffekt nur aus Maschinenbefehlen, die der Prozessor direkt versteht. Für jeden Prozessor gibt es Sprungbefehle, um ihm z. B. mitteilen, dass er die Ausführung an einer anderen Stelle fortzusetzen soll. Der Einsprungspunkt enthält einen solchen Sprungbefehl zur Hauptroutine. Wenn Sie ein Programm starten, werden von dort aus für gewöhnlich noch weitere Funktionen aufgerufen, aber ohne eine main()-Funktion kann der Linker später kein ausführbares Programm erstellen. Das void innerhalb der runden Klammern der main()-Funktion steht für einen leeren Datentyp, die Funktion hat also keine Übergabeparameter. Mehr zu Funktionen und Parametern erfahren Sie in den nächsten Kapiteln.
Der Anfang und das Ende der main()-Funktion – und von Funktionen überhaupt – wird zwischen geschweifte Klammern { ... } gesetzt, die hier in Zeile (02) hinter der main()-Funktion geöffnet und in Zeile (05) geschlossen werden. Alles zwischen diesen geschweiften Klammern wird als Anweisungsblock bezeichnet. Die Klammern fassen somit mehrere Anweisungen, die die main()-Funktion auszuführen hat, zu einem Block zusammen. Beachten Sie, dass die geschweiften Klammern nicht unbedingt so positioniert werden müssen wie in unserem Beispiel. Das Beispiel entspricht einfach unserem eigenen Schreibstil, den wir Ihnen deshalb empfehlen, weil er möglichst übersichtliche Programme erzeugen soll. Sie könnten die geschweiften Klammern auch folgendermaßen setzen:
{ /* Anweisungen */ }
oder so:
{
/* Anweisungen */
}
Wir empfehlen Ihnen aber trotzdem zumindest die zweite Schreibweise, in der die Anweisungen im Anweisungsblock mit der Tabulatortaste eingerückt werden. Im Inneren des Anweisungsblocks wird in Zeile (03) die Funktion printf() ausgeführt. Wie bereits erwähnt, ist diese Funktion in der Header-Datei stdio.h deklariert und wird für die formatierte Ausgabe von Text verwendet. Der auszugebende Text muss dabei immer zwischen die doppelten Hochkommata ("Mein erstes Programm\n") gestellt werden. Normalerweise schließt printf() die Zeilen nicht automatisch ab, das heißt, der Cursor wird nicht stets an den Anfang der nächsten Zeile gesetzt. Dies müssen Sie bewusst auslösen, indem Sie am Ende Ihres Textes \n anfügen. Dieses sogenannte Metazeichen, das einem Backslash folgt, bedeutet »neue Zeile« (Newline). Es gibt in C noch weitere wichtige Metazeichen, die Sie im weiteren Verlauf noch kennenlernen werden.
In Zeile (04) geben Sie der Hauptfunktion main() mit return den Rückgabewert 0 zurück. Im Normalfall bedeutet dies, dass das Programm sauber beendet wurde. Ein anderer Rückgabewert als 0 bedeutet, dass das Programm mit einem Fehler beendet wurde; die Bedeutung der Fehlernummern ist jedoch vom Betriebssystem abhängig.
Sie haben sicherlich schon gemerkt, dass am Ende der Zeilen (03) und (04) jeweils ein Semikolon (Strichpunkt) stehen muss, und dass der Compiler »meckert«, wenn Sie diese vergessen. Mit dem Semikolonzeichen wird in C eine Anweisung beendet. Mit der Programmausführung geht es dann in der nächsten Zeile weiter. So wird in diesem Beispiel mit der nächsten Zeile fortgefahren und die Anweisung return 0; ausgeführt, wenn die Anweisung printf(...); fertig ausgeführt worden ist.