Verzweigen mit if und switch
Verzweigungen sehen fast aus wie in Java: Die Bedingung steht in runden Klammern, der Block in geschweiften.
#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; }
$ ./wetter Jacke mitnehmen.
- Vergleichen:
==gleich,!=ungleich,<,<=,>,>=. - Verknüpfen:
&&und,||oder,!nicht — statt Pythonsand,or,not. - Wahrheitswerte:Bedingungen sind in C Zahlen:
0ist falsch, jeder andere Wert wahr. - Ergebnis eines Vergleichs:ist die Zahl
1(wahr) oder0(falsch). - else if:wird nur geprüft, wenn alle Bedingungen davor falsch waren.
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);
Einlass 1 0 0
Die Falle: Ein einzelnes = ist eine Zuweisung — und die hat selbst einen Wert.
int alter = 12; if (alter = 18) { // Zuweisung statt Vergleich! printf("volljährig: %d\n", alter); }
$ 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
alterauf 18; der Wert 18 ist nicht 0, also immer wahr. - Richtig:
if (alter == 18)vergleicht nur und ändert nichts.
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"); }
Wochenende
- switch:springt zu dem
case, dessen Wert passt — nur für ganze Zahlen und Zeichen. - break:beendet den
switch. Ohnebreakläuft das Programm in den nächstencaseweiter. - default:greift, wenn kein
casepasst.
Bedingungen: 0 ist falsch, alles andere wahr. Vergleichen mit ==, zuweisen mit =.
Wiederholen mit Schleifen
C hat drei Schleifen. Sie unterscheiden sich darin, wann die Bedingung geprüft wird.
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); }
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 += 2erhöht um 2,n--verringert um 1. - Python-Vergleich:
for i in range(4):entsprichtfor (int i = 0; i < 4; i++). - range mit Schritt:
range(2, 10, 2)entsprichtfor (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.
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.
Schleifen: while und for prüfen vorher, do … while prüft nachher (mindestens ein Durchlauf).
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.
