EMZETT.
Login

Kurz: // Funktionsprototyp (Deklaration) int quadrat(int x);

Teil des Kurses C

Kapitel 2 von 15 im Kurs C. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

aufbau.c

#include <stdio.h>          /* Präprozessor: Header einbinden */
 
#define MAX 3               /* Makro: wird vor dem Übersetzen ersetzt */
 
// Funktionsprototyp (Deklaration)
int quadrat(int x);
 
int main(void) {
    for (int i = 1; i <= MAX; i++) {
        printf("%d zum Quadrat ist %d\n", i, quadrat(i));
    }
    return 0;
}
 
// Funktionsdefinition
int quadrat(int x) {
    return x * x;
}

Ausgabe:

1 zum Quadrat ist 1
2 zum Quadrat ist 4
3 zum Quadrat ist 9

Bestandteile

TeilBedeutung
#include <...>holt Deklarationen aus einem Header (Systemheader in <>, eigene in "")
#define NAME wertTextersetzung durch den Präprozessor
Prototypmeldet dem Compiler eine Funktion an, bevor sie definiert wird
mainStartfunktion, wird vom Betriebssystem aufgerufen
/* ... */, // ...Kommentare (// seit C99)

C liest den Code von oben nach unten. Eine Funktion muss vor ihrer Benutzung deklariert sein, daher die Prototypen (oder die Funktion steht davor).

printf: formatierte Ausgabe

PlatzhalterTyp
%d / %iint
%uunsigned int
%ld, %lldlong, long long
%fdouble (%.2f: zwei Nachkommastellen)
%cchar
%sText (String)
%x, %ohexadezimal, oktal
%pZeiger (Adresse)
%zusize_t
%%ein Prozentzeichen
#include <stdio.h>
 
int main(void) {
    int alter = 17;
    double preis = 19.99;
    char buchstabe = 'A';
    printf("Alter: %d, Preis: %.2f, Zeichen: %c\n", alter, preis, buchstabe);
    printf("|%5d|%-5d|%05d|\n", 42, 42, 42);
    printf("hex %x, oktal %o, Prozent: 50%%\n", 255, 8);
    printf("Text: %s, breit: |%10s|\n", "C", "rechts");
    return 0;
}

Ausgabe:

Alter: 17, Preis: 19.99, Zeichen: A
|   42|42   |00042|
hex ff, oktal 10, Prozent: 50%
Text: C, breit: |    rechts|

Achtung

Der Platzhalter muss zum Typ passen. printf("%d", 3.5) ist undefiniertes Verhalten. Der Compiler warnt mit -Wall, wenn du die Formatzeichen prüfen lässt.

Der Rückgabewert von main

return 0 (oder EXIT_SUCCESS) bedeutet Erfolg, ein anderer Wert (EXIT_FAILURE) einen Fehler. Das Betriebssystem und Skripte werten ihn aus (echo $? in der Shell).

Typische Compiler-Meldungen

#include <stdio.h>
int main(void) {
    int x = 5
    printf("%d\n", x);
    return 0;
}

Fehlermeldung:

error: expected ',' or ';' before 'printf'

Lies Fehler von oben nach unten. Oft ist die Ursache in der Zeile davor (fehlendes Semikolon).

Meldung (sinngemäß)Ursache
undefined reference to 'x'Linker findet die Funktion nicht (Datei oder Bibliothek -lm fehlt)
implicit declaration of functionHeader oder Prototyp fehlt
warning: unused variableVariable nie benutzt
segmentation faultLaufzeitfehler, ungültiger Speicherzugriff

Warnungen ernst nehmen

gcc -Wall -Wextra -Wpedantic -Werror -std=c17 -g -O2 programm.c -o programm

-Werror macht Warnungen zu Fehlern, -g fügt Debuginformationen hinzu, -O2 schaltet Optimierungen ein, -fsanitize=address,undefined findet viele Speicherfehler zur Laufzeit.

Merke

  • Aufbau: #include, Prototypen, main, Funktionsdefinitionen
  • Der Compiler liest von oben nach unten: erst deklarieren, dann benutzen
  • printf mit Platzhaltern (%d, %f, %s, %c); sie müssen zum Typ passen
  • -Wall -Wextra immer einschalten, Warnungen beheben
  • Rückgabewert von main meldet Erfolg (0) oder Fehler

Übungsaufgabe

Schreibe ein Programm mit einer Funktion kubik(int), das die dritten Potenzen von 1 bis 5 in einer ausgerichteten Tabelle ausgibt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Was ist C?

Weiter: Variablen und Datentypen

Alle Kapitel: C im Überblick