Temat: 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ęciebreakna końcu każdego przypadkucase, co prowadzi do nieoczekiwanego "przez przypadkowości" (fall-through). - Niezgodność typów: Wartości w przypadkach
casemuszą 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
casejest błędem;caseakceptuje tylko stałe wyrażenia.
Dobre praktyki w użyciu instrukcji switch
- Zawsze używaj
break: Aby uniknąć niechcianego "przez przypadkowości", zawsze umieszczajbreakna końcu każdego blokucase. - Rozważ użycie
default: Zawsze rozważ dodanie przypadkudefaultdo obsługi nieoczekiwanych wartości. - Unikaj zagnieżdżania
switch: Chociaż zagnieżdżanie jest możliwe, zbyt duża ilość zagnieżdżonych instrukcjiswitchmoże uczynić kod trudnym do zrozumienia i utrzymania. - Ogranicz liczbę przypadków
case: Zbyt wiele przypadków w jednej instrukcjiswitchmoż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
switchtak, aby był łatwy do zrozumienia i utrzymania.
| Testy przypięte do lekcji | |
|---|---|
| Aby uzyskać dostęp do testów i ćwiczeń interaktywnych - Zaloguj się |