Erstes C-Programm erklärt

In der letzten Lektion haben wir den GCC-Compiler installiert und das einfachste Hello-World-Beispiel erstellt. In dieser Lektion erklären wir dieses Beispiel Zeile für Zeile. Zuerst sehen wir den Code:

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}
Code-Sprache: Arduino (arduino)

Der Code ist sehr einfach: Er gibt eine einzelne Textzeile aus.

Im Folgenden analysieren wir jede Code-Zeile von oben nach unten.

1. #include <stdio.h>

In der ersten Lektion haben wir kurz die Vorverarbeitung angesprochen. Diese erste Code-Zeile ist eine Vorverarbeitungsanweisung. Woran erkennen wir das? An dem Symbol #.

# : Markierung für Vorverarbeitungsbefehle, wird an den Präprozessor übergeben und als erster Schritt der Kompilierung ausgeführt.

include : Schlüsselwort zum Einbinden einer Header-Datei. Seine Aufgabe ist, den gesamten Code der angegebenen Datei in das aktuelle Programm zu kopieren.

<stdio.h> : Standard-Ein-/Ausgabe-Headerdatei (standard input output). Darin sind Funktionen für Bildschirmausgabe und Tastatureingabe verpackt. Die unten genutzte Funktion printf ist in dieser Datei definiert.

Streng genommen gehört die Vorverarbeitung nicht zur Syntax der C-Sprache. Die C-Vorverarbeitung ist kein Teil der zentralen C-Syntax – sie ist eine separate Phase, die der Compiler vor der eigentlichen Kompilierung ausführt. Sie ist Teil des gesamten Kompilierungsprozesses, aber nicht der eigentlichen Syntax- und Semantikstruktur von C.

Einfach gesagt: Ein separater Vorverarbeitungsprogramm führt Textersetzungen durch. Bei #include <stdio.h> wird die gesamte Datei stdio.h an diese Stelle kopiert und die Zeile ersetzt. Angenommen, stdio.h enthielte nur den Text AAAAAAAAA.

Dann sähe der Code vor der Übergabe an den Compiler so aus:

 AAAAAAAAA

int main()
{
    printf("hello, world\n");
    return 0;
}
Code-Sprache: Arduino (arduino)

Das ist natürlich nur eine Annahme; der echte Inhalt der Headerdatei ist deutlich komplexer. Interessierte können die Datei selbst öffnen und prüfen.

Diese Headerdatei liegt auf Ihrem Computer, der Pfad unterscheidet sich je nach Betriebssystem:

Linux/Unix-Systeme: Meist unter /usr/include/stdio.h

Windows (Visual Studio): Unter VC/include/stdio.h

macOS (Xcode): Unter /Applications/Xcode.app/.../usr/include/stdio.h

Sie können mit einem Suchwerkzeug den Speicherort dieser Datei auf Ihrem PC ermitteln.

Haben Sie jetzt ein grundlegendes Verständnis der Vorverarbeitung?

Wenn Sie die Zeile #include <stdio.h> entfernen, erkennt der Compiler printf nicht und gibt einen Fehler aus. Probieren Sie, diese Zeile zu löschen und mit gcc zu kompilieren, um das Ergebnis zu sehen.

Nach dem Entfernen der Headerdatei

Beim erneuten Kompilieren erscheint eine Fehlermeldung

2. int main()

main = Einstiegsfunktion eines C-Programms

  1. Bei der Ausführung jedes C-Programms beginnt das Betriebssystem automatisch mit der Funktion main. Ein Programm darf genau eine main-Funktion besitzen.
  2. int : Gibt den Typ des Rückgabewerts der Funktion an, Abkürzung für integer (Ganzzahl).
  3. () : Kennzeichnet eine Funktion; zwischen den Klammern können Parameter stehen, leere Klammern bedeuten keine Parameter.

Diese main-Schreibweise wurde von den meisten späteren Programmiersprachen übernommen: Sie ist der einzige Startpunkt des Programms. Wenn Sie eine EXE-Datei doppelklicken oder einen Befehl im Terminal eingeben (z. B. hello), ruft das Betriebssystem automatisch diese main-Funktion auf.

Das int am Anfang ist der Rückgabetyp der Funktion. Wenn wir später eigene Funktionen definieren, müssen wir immer diesen Typ angeben – das erklären wir in späteren Lektionen detailliert.

Die runden Klammern () deklarieren, welche Parameter die Funktion akzeptiert. Hier sind sie leer, also akzeptiert die Funktion keine Parameter. Es gibt auch eine Variante mit Parametern:

int main(int argc, char *argv[])Code-Sprache: CSS (css)

Diese Schreibweise akzeptiert zwei Parameter: einen Integer und ein Zeichenketten-Array. Das besprechen wir in den folgenden Lektionen.

Die Parameter der main-Funktion werden vom Betriebssystem übergeben. Woher stammen diese Werte?

Sie haben sicher schon Befehlszeilentools wie ping verwendet. Beispiel: ping 12.36.4.xxx prüft eine Netzverbindung. ping entspricht dem Programm ping.exe, die IP-Adresse 12.36.4.xxx ist ein Parameter, der an die main-Funktion von ping.exe übergeben wird.

Genauso verhält es sich mit unserem Hello-Programm: Wenn Sie hello abc im Terminal ausführen, wird abc als Parameter übergeben. Die Variablen in den runden Klammern von main empfangen diese vom Benutzer eingegebenen und vom Betriebssystem weitergereichten Werte.

Merken Sie sich vorerst einfach: main ist der einzige Einstiegspunkt des Programms, es darf nur eine geben, sie wird vom Betriebssystem aufgerufen, und Befehlszeilenargumente werden über das Betriebssystem an main übergeben.

3. { } Geschweifte Klammern

Definieren die Grenzen des Funktionskörpers: { markiert den Anfang des Funktionscodes, } das Ende. Der gesamte Code der Funktion steht zwischen den beiden Klammern.

4. printf("hello, world\n");

  • printf : Abkürzung für print format, formatierte Ausgabefunktion, die Text auf der Konsole ausgibt.
  • Doppelte Anführungszeichen " " : Umschließen eine Zeichenkettenkonstante, der auszugebende Text steht dazwischen.
  • \n : Escape-Zeichen, Zeilenumbruch: Nach der Textausgabe springt der Cursor automatisch in die nächste Zeile.
  • ; : Anweisungsende-Marker in C. Jede ausführbare Anweisung muss mit einem Semikolon enden, fehlt es, tritt ein Kompilierfehler auf.

Das f am Ende des Funktionsnamens steht für Format (Formatierung), darauf gehen wir später detailliert ein. Verstehen Sie vorerst nur: Diese Zeile gibt den Text hello, world\n auf der Konsole aus, und \n sorgt für einen automatischen Zeilenumbruch danach.

5. return 0;

  • return : Gibt einen Ganzzahlwert an die Funktion main zurück und beendet die aktuelle Funktion. Warum brauchen wir return? Weil wir am Anfang von main den Rückgabetyp int angegeben haben, müssen wir innerhalb der Funktion eine Ganzzahl zurückgeben.
  • 0 : Branchenübliche Vereinbarung für fehlerfreien, regulären Programmabschluss – teilt dem Betriebssystem das Ausführungsergebnis mit.
    • Rückgabe von 0 = Programmausführung erfolgreich
    • Rückgabe einer Zahl ungleich 0 (z. B. return 1;) = Programmabbruch mit Fehler

Moderne C-Standards erlauben das Weglassen von return 0; am Ende von main; der Compiler ergänzt es automatisch. Für Anfänger empfehle ich jedoch, es vollständig nach Konvention zu schreiben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert