MINT lernen

Kontrollstrukturen in C

Wie entscheidet ein C-Programm — und warum läuft manche Schleife kein einziges Mal?

1

Verzweigen mit if und switch

Verzweigungen sehen fast aus wie in Java: Die Bedingung steht in runden Klammern, der Block in geschweiften.

C · wetter.c
#include <stdio.h>

int main(void) {
    int temperatur = 18;

    if (temperatur >= 25) {
        printf("Freibad!\n");
    } else if (temperatur >= 15) {
        printf("Jacke mitnehmen.\n");
    } else {
        printf("Lieber drinnen bleiben.\n");
    }
    return 0;
}
Konsole
$ ./wetter
Jacke mitnehmen.
  • Vergleichen:== gleich, != ungleich, <, <=, >, >=.
  • Verknüpfen:&& und, || oder, ! nicht — statt Pythons and, or, not.
  • Wahrheitswerte:Bedingungen sind in C Zahlen: 0 ist falsch, jeder andere Wert wahr.
  • Ergebnis eines Vergleichs:ist die Zahl 1 (wahr) oder 0 (falsch).
  • else if:wird nur geprüft, wenn alle Bedingungen davor falsch waren.
C · Ausschnitt aus main
int alter = 15, hatTicket = 1;
if (alter >= 12 && hatTicket) {        // hatTicket ist 1, also wahr
    printf("Einlass\n");
}
printf("%d %d %d\n", 3 < 5, 3 == 5, !7);
Konsole
Einlass
1 0 0

Die Falle: Ein einzelnes = ist eine Zuweisung — und die hat selbst einen Wert.

C · falle.c, Ausschnitt aus main
int alter = 12;
if (alter = 18) {                      // Zuweisung statt Vergleich!
    printf("volljährig: %d\n", alter);
}
Konsole
$ gcc -Wall falle.c -o falle
falle.c:5:9: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
$ ./falle
volljährig: 18
  • if (alter = 18):setzt alter auf 18; der Wert 18 ist nicht 0, also immer wahr.
  • Richtig:if (alter == 18) vergleicht nur und ändert nichts.
C · Ausschnitt aus main
int tag = 6;                 // 1 = Montag … 7 = Sonntag
switch (tag) {
    case 6:
    case 7:
        printf("Wochenende\n");
        break;               // switch verlassen
    case 5:
        printf("Fast geschafft\n");
        break;
    default:                 // alle anderen Werte
        printf("Schultag\n");
}
Konsole
Wochenende
  • switch:springt zu dem case, dessen Wert passt — nur für ganze Zahlen und Zeichen.
  • break:beendet den switch. Ohne break läuft das Programm in den nächsten case weiter.
  • default:greift, wenn kein case passt.
Merke

Bedingungen: 0 ist falsch, alles andere wahr. Vergleichen mit ==, zuweisen mit =.

2

Wiederholen mit Schleifen

C hat drei Schleifen. Sie unterscheiden sich darin, wann die Bedingung geprüft wird.

C · Ausschnitt aus main
int guthaben = 20;               // while: prüft vor jedem Durchlauf
while (guthaben >= 7) {
    guthaben = guthaben - 7;
}
printf("Rest: %d\n", guthaben);

int wurf = 0;                    // do … while: prüft danach
do {
    wurf = wurf + 4;
    printf("Wurf %d\n", wurf);
} while (wurf < 10);

for (int i = 0; i < 4; i++) {    // for: Start; Bedingung; Schritt
    printf("%d ", i * i);
}
Konsole
Rest: 6
Wurf 4
Wurf 8
Wurf 12
0 1 4 9
  • while:prüft vor jedem Durchlauf; ist die Bedingung gleich falsch, läuft der Rumpf nie.
  • do … while:prüft nach dem Durchlauf, läuft also mindestens einmal. Semikolon nach while (…);!
  • for:for (Start; Bedingung; Schritt) — ideal, wenn die Anzahl der Durchläufe feststeht.
  • i++:ist kurz für i = i + 1; i += 2 erhöht um 2, n-- verringert um 1.
  • Python-Vergleich:for i in range(4): entspricht for (int i = 0; i < 4; i++).
  • range mit Schritt:range(2, 10, 2) entspricht for (int i = 2; i < 10; i += 2) — die Grenze 10 gehört nicht dazu.

Lies das Programmstück und tippe zuerst, was es ausgibt. Danach führst du es mit Schritt ▸ (oder Pfeil rechts im Quelltext) Zeile für Zeile aus und siehst, wie sich die Variablen ändern. Sechs Stücke, jedes mit einer kleinen Falle.

Was gibt das Programm aus?

C · Stück 1
Dein Tipp:
Treffer: 0 von 0
Konsole

Halte fest: Vor jedem Durchlauf von for und while wird die Bedingung geprüft — ist sie gleich zu Beginn falsch, läuft der Rumpf nie. Nur do … while läuft mindestens einmal. Auch in Bedingungen gilt: int / int bleibt ganzzahlig, und = ist eine Zuweisung.

Merke

Schleifen: while und for prüfen vorher, do … while prüft nachher (mindestens ein Durchlauf).

3

Allgemeine Hinweise

break nicht vergessen

Fehlt im switch das break, werden auch die Anweisungen der folgenden case-Zweige ausgeführt.

Kein Semikolon hinter for

for (int i = 0; i < 3; i++); hat einen leeren Rumpf — der Block danach läuft nur einmal. gcc -Wall warnt mit misleading-indentation.

Endlosschleife stoppen

Hängt dein Programm in einer Schleife fest, brichst du es in der Konsole mit Strg+C ab. Prüfe dann, ob sich die Variable in der Bedingung überhaupt ändert.

Videos