Historia pytania:
Operator switch został wprowadzony do języka C w celu ułatwienia zarządzania wieloma gałęziami na podstawie wartości wyrażenia. Jest alternatywą dla długiego ciągu if-else i jest szeroko stosowany do obsługi komend, stanów i wartości enumeracji.
Problem:
Główne niebezpieczeństwa związane z operatorem switch dotyczą zapomnianych operatorów break, nieoczekiwanego trafienia w "przepływ" (fallthrough), trudności z zmiennymi zadeklarowanymi w bloku, a także tego, że typ wyrażenia musi być całkowity.
Rozwiązanie:
Aby bezpiecznie korzystać:
break (lub wyraźnie oznaczaj potrzebę fallthrough komentarzami);int lub kompatybilnych z nim;case, obsługuj w gałęzi default;case, lub w {}-bloku.Przykład kodu:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("Poniedziałek "); break; case 2: printf("Wtorek "); break; case 3: printf("Środa "); break; case 4: printf("Czwartek "); break; case 5: printf("Piątek "); break; case 6: case 7: printf("Weekend "); break; default: printf("Nieznany dzień "); } }
Kluczowe cechy:
Czy można używać typu float w wyrażeniu switch?
Nie. Standard języka C wymaga, aby wyrażenie w switch było całkowite lub przekształcone do całkowitego (char, short, int, long, enum itp.).
Co się stanie, jeśli zamienić miejscami case'y — czy kolejność wpływa na logikę?
Kolejność deklaracji case w switch nie wpływa na wyszukiwanie odpowiedniej wartości. Kod wykonuje się od pasującego case do pierwszego break. Ale kolejność ma znaczenie w przypadku braku break (fallthrough).
Czy można deklarować zmienne wewnątrz case bez klamer?
Nie. Jeśli zadeklarujesz zmienną po case bez dodatkowego bloku {} — spowoduje to błąd kompilacji. Poprawnie:
switch (x) { case 1: { int y = 0; break; } }
W dużym projekcie programista zapomniał o break po jednym z case i otrzymał błędne wykonanie kilku gałęzi z rzędu. Błąd został dostrzegnięty dopiero przez użytkownika.
Zalety:
Wady:
W przypadku, gdy przepływ był potrzebny, stosowano komentowane fallthrough z wyjaśnieniem, wszystkie krytyczne case były obsługiwane przez break lub return, w default wyświetlane było ostrzeżenie.
Zalety:
Wady: