Historie der Frage:
Der switch-Operator wurde in die C-Sprache eingeführt, um die Kontrolle bequem auf mehrere Zweige basierend auf dem Wert eines Ausdrucks zu verteilen. Dies ist eine Alternative zu einer großen if-else-Kette und wird häufig zur Verarbeitung von Befehlen, Zuständen und Enum-Werten verwendet.
Problematik:
Die Hauptgefahren des switch-Operators hängen mit vergessenen break-Operatoren, unerwartetem "Fallthrough", Schwierigkeiten mit innerhalb des Blocks deklarierten Variablen sowie damit zusammen, dass der Typ des Ausdrucks ganzzahlig sein muss.
Lösung:
Für eine sichere Verwendung:
break verwenden (oder die Notwendigkeit von Fallthrough ausdrücklich mit Kommentaren kennzeichnen);int oder kompatibel sind;case nicht vorgesehen sind, im default-Zweig verarbeiten;case-Konstruktionen oder im {}-Bereich deklarieren.Beispielcode:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("Montag "); break; case 2: printf("Dienstag "); break; case 3: printf("Mittwoch "); break; case 4: printf("Donnerstag "); break; case 5: printf("Freitag "); break; case 6: case 7: printf("Wochenende "); break; default: printf("Unbekannter Tag "); } }
Wichtige Merkmale:
case zum anderen geschieht automatisch ohne break.Kann man den Typ float im switch-Ausdruck verwenden?
Nein. Der Standard der C-Sprache erfordert, dass der Ausdruck im switch ganzzahlig oder in einen ganzzahligen Typ umgewandelt wird (char, short, int, long, enum usw.).
Was passiert, wenn man die case-Anweisungen vertauscht - beeinflusst die Reihenfolge die Logik?
Die Reihenfolge der case-Deklarationen im switch hat keinen Einfluss auf die Suche nach dem benötigten Wert. Der Code wird ab dem übereinstimmenden case bis zum ersten break ausgeführt. Aber die Reihenfolge beeinflusst das Fehlen eines break (Fallthrough).
Kann man Variablen innerhalb von case ohne geschweifte Klammern deklarieren?
Nein. Wenn man eine Variable nach case ohne zusätzlichen Block {} deklariert, führt das zu einem Kompilierungsfehler. Korrekt:
switch (x) { case 1: { int y = 0; break; } }
break am Ende eines case-Blocks, was unnötige Side-Effects verursacht.default nicht verwenden, was die Wartung erschwert.case-Marke ohne {}-Block deklarieren.In einem großen Projekt hat ein Programmierer das break nach einem der case vergessen und erhielt dadurch die fehlerhafte Ausführung mehrerer Zweige nacheinander. Der Bug wurde nur vom Benutzer bemerkt.
Vorteile:
Nachteile:
In Fällen, in denen Fallthrough erforderlich war, wurden kommentierte Fallthroughs mit Erläuterungen verwendet, alle kritischen case wurden mit break oder return ergänzt, im default wurde eine Warnung ausgegeben.
Vorteile:
Nachteile: