C++: Instrukcja switch
Instrukcja switch w C++ jest strukturą kontrolną, która pozwala wykonywać różne bloki kodu w zależności od wartości zmiennej. Jest to alternatywa dla wielokrotnego używania instrukcji if-else, pozwalając na bardziej uporządkowane i czytelne zarządzanie wieloma ścieżkami wykonania.
Składnia instrukcji switch
switch (wyrażenie) {
case wartość1:
// blok kodu do wykonania, gdy wyrażenie == wartość1
break;
case wartość2:
// blok kodu do wykonania, gdy wyrażenie == wartość2
break;
...
default:
// blok kodu do wykonania, gdy żaden inny przypadek nie pasuje
}
W powyższej strukturze, switch ocenia wyrażenie i porównuje jego wartość z każdym przypadkiem (case). Gdy wartość wyrażenia zgadza się z wartością określoną w case, odpowiedni blok kodu zostaje wykonany. Kluczowe słowo break na końcu każdego przypadku zapobiega tzw. "przez przypadkowości" (fall-through), czyli przejściu do kolejnego przypadku bez oceny jego warunku.
Każda instrukcja switch może zawierać również przypadek default, który jest wykonywany, gdy żaden z przypadków case nie pasuje do wartości wyrażenia. Przypadek default jest opcjonalny, ale często stosowany do obsługi nieoczekiwanych wartości wyrażenia.
Przykłady wykorzystana instrukcji switch
int numerDnia = 3;
switch (numerDnia) {
case 1:
cout << "Poniedziałek";
break;
case 2:
cout << "Wtorek";
break;
case 3:
cout << "Środa";
break;
// ...
}
Zmienna numerDnia ma wartość 3. Instrukcja switch przyjmuje jako warunek wartość tej zmiennej, następnie sprawdza, czy pasuje ona do któregoś z przypadków (case). Wartość ta jest kolejno porównywana z każdym przypadkiem. Gdy porównywane wartości będą sobie równe, wykonane zostaną instrukcje z danego case. W naszym przypadku, jako iż w warunku była wartość 3, wypisany na ekran zostanie komunikat o treści: Środa. Instrukcja break zapobiega wykonaniu kodu z kolejnego przypadku.
Kolejny przypadek związany będzie z ocenami uzyskiwanymi w Stanach Zjednoczonych.
char ocena = 'B';
switch (ocena) {
case 'A':
cout << "Doskonała!";
break;
case 'B':
case 'C':
cout << "Dobra!";
break;
case 'D':
cout << "Zadowalająca.";
break;
case 'F':
cout << "Niezaliczony.";
break;
default:
cout << "Nieprawidłowa ocena.";
}
Przykład ilustruje, że przypadki (case) nie muszą koniecznie być liczbami. Tutaj, dla ocena
równego 'B', wyświetlony zostanie tekst "Dobra!". Zauważ, że przypadki 'B' i 'C' mają wspólny blok kodu, co jest przykładem grupowania przypadków.
Default
Jeśli switch
obsługuje zmienną, która teoretycznie może przyjąć wartości poza zdefiniowanymi przypadkami case
, zaleca się dodanie default
. Jest to opcja obsługująca nieprzewidzianą wartość.
switch (dniTygodnia) {
case 1: cout << "Poniedziałek"; break;
case 2: cout << "Wtorek"; break;
// ... inne przypadki
default: cout << "Nieprawidłowy dzień tygodnia";
}
Zakładając, że użytkownik wprowadza wartość zmiennej dniTygodnia z powyższego przykładu, możemy przypuszczać, że wpiszę liczbę od 1 do 7. Warto jednak założyć, że celowo lub nie, może popełnić błąd. Jeżeli wpisze prawidłową liczbę, wypisany zostanie komunikat z odpowiadającym jej dniem tygodnia, w przeciwnym razie, komunikat o błędzie: Nieprawidłowy dzień tygodnia.
switch (kodOdpowiedziSerwera) {
case 200: cout << "OK"; break;
case 404: cout << "Nie znaleziono"; break;
// ... inne kody odpowiedzi
default: cout << "Nieznany kod odpowiedzi";
}
Kolejny przykład pokazuję obsługę uzyskanego z serwera kodu odpowiedzi. W przypadku obsługiwanych kodów, jak 200 czy 404 zostanie wypisany stosowny komunikat z opisem tego kodu. Natomiast w przypadku nieobsługiwanego kodu odpowiedzi wyświetlony zostanie domyślny komunikat, o tym, że jest on nieznany.
Zagnieżdżanie switch
Podobnie, jak miało to miejsce w instrukcji warunkowej if, instrukcję switch
można zagnieżdżać. Zagnieżdżanie instrukcji switch
pozwala na tworzenie wielopoziomowych struktur decyzyjnych, gdzie decyzje na jednym poziomie prowadzą do kolejnych zestawów decyzji.
int kategoria = 1;
int podkategoria = 2;
switch (kategoria) {
case 1:
switch (podkategoria) {
case 1:
cout << "Kategoria 1, Podkategoria 1";
break;
case 2:
cout << "Kategoria 1, Podkategoria 2";
break;
}
break;
case 2:
// Inne przypadki dla kategorii 2
break;
}
Typowe błędy w użyciu instrukcji switch
- Brak
break
: Jednym z najczęstszych błędów jest pominięciebreak
na końcu każdego przypadkucase
, co prowadzi do nieoczekiwanego "przez przypadkowości" (fall-through
). - Niezgodność typów: Wartości w przypadkach
case
muszą być tego samego typu, co wyrażenie wswitch
. Użycie niezgodnych typów może prowadzić do błędów kompilacji. - Zbyt złożone warunki: Próba użycia złożonych warunków w
case
jest błędem;case
akceptuje tylko stałe wyrażenia.
Dobre praktyki w użyciu instrukcji switch
- Zawsze używaj
break
: Aby uniknąć niechcianego "przez przypadkowości", zawsze umieszczajbreak
na końcu każdego blokucase
. - Rozważ użycie
default
: Zawsze rozważ dodanie przypadkudefault
do obsługi nieoczekiwanych wartości. - Unikaj zagnieżdżania
switch
: Chociaż zagnieżdżanie jest możliwe, zbyt duża ilość zagnieżdżonych instrukcjiswitch
może uczynić kod trudnym do zrozumienia i utrzymania. - Ogranicz liczbę przypadków
case
: Zbyt wiele przypadków w jednej instrukcjiswitch
może sprawić, że stanie się ona zbyt skomplikowana. W takich przypadkach rozważ refaktoryzację kodu lub użycie innych struktur decyzyjnych. - Zachowaj spójność i czytelność: Formatuj i dokumentuj swój kod
switch
tak, aby był łatwy do zrozumienia i utrzymania.
Testy przypięte do lekcji | |
---|---|
Aby uzyskać dostęp do testów i ćwiczeń interaktywnych - Zaloguj się |