#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
| Teil | Bedeutung |
|---|---|
#include <...> | holt Deklarationen aus einem Header (Systemheader in <>, eigene in "") |
#define NAME wert | Textersetzung durch den Präprozessor |
| Prototyp | meldet dem Compiler eine Funktion an, bevor sie definiert wird |
main | Startfunktion, 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
| Platzhalter | Typ |
|---|---|
%d / %i | int |
%u | unsigned int |
%ld, %lld | long, long long |
%f | double (%.2f: zwei Nachkommastellen) |
%c | char |
%s | Text (String) |
%x, %o | hexadezimal, oktal |
%p | Zeiger (Adresse) |
%zu | size_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|
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 function | Header oder Prototyp fehlt |
warning: unused variable | Variable nie benutzt |
segmentation fault | Laufzeitfehler, 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
printfmit Platzhaltern (%d,%f,%s,%c); sie müssen zum Typ passen-Wall -Wextraimmer einschalten, Warnungen beheben- Rückgabewert von
mainmeldet Erfolg (0) oder Fehler
Aufgabe
Schreibe ein Programm mit einer Funktion kubik(int), das die dritten Potenzen von 1 bis 5 in einer ausgerichteten Tabelle ausgibt.