W dzisiejszym materiale przyjrzymy się jednej z konstrukcji składniowych widzianej w wielu językach wysokiego poziomu. Pokażę Ci instrukcję wielokrotnego wyboru, która w programowaniu znana jest pod hasłem "switch" 😊! Zapraszam do sięgnięcia po kolejną darmową wiedzę 👋!

WYJAŚNIAM KONSTRUKCJĘ "SWITCH" W PROGRAMOWANIU!

Mogłeś(-aś) już nieraz spotkać się z hasłem "switch" w którymś języku programowania, nawet choćby przeglądając czyjeś kody źródłowe. Wyjaśnię co to takiego, jak to stosować, kiedy najlepiej po to sięgnąć i zakończymy krótkim przykładem praktycznym 😉!

CZYM JEST INSTRUKCJA "SWITCH" W PROGRAMOWANIU?

W programowaniu, "switch" określane jest po polsku jako "instrukcja wielokrotnego wyboru". Służy do czytelniejszego pisania bloków kodu mających na celu rozpatrywanie wielu przypadków, tak jak blok "else if" w instrukcji warunkowej ❤️.

Trzeba jednak wiedzieć, że to nie funkcjonuje w 100% tak, jak instrukcja "if" ⚠️! "switch" umożliwia czytelniejszą i bardziej profesjonalną formę zapisu instrukcji dla różnych ścieżek decyzyjnych jakimi program może pójść, aczkolwiek musimy być świadom ograniczeń jakie to obejmuje 😮!

Instrukcja "switch" nie jest wymagana aby w ogóle programować, choć bardzo podnosi jakość konstrukcji, w których dana wartość może przyjąć jedną z kilku możliwości i dla każdej z nich jest określone co innego do wykonania, ponieważ wszystkie przypadki są zawarte w tym samym bloku 👍. W połączeniu z typem wyliczeniowym "enum", podnosi rewelacyjnie bezpieczeństwo i czytelność sprawiając, że przypadki opatrzone konkretnymi nazwami a nie stałymi, pozwalają natychmiast zrozumieć dlaczego to zostało tak napisane i swobodnie modyfikować wartości bez zmian w samej instrukcji "switch" 🤩!

W tym wszystkim jest jedno duże "ale" 💥!

KIEDY MOŻEMY UŻYĆ INSTRUKCJI "SWITCH" W PROGRAMOWANIU?

Kiedy wszystkie warunki skupiają się tylko na sprawdzeniu czy zmienna posiada konkretną wartość. To oznacza, to dotyczy tylko i wyłącznie badania w stylu czy coś jest równe jakiejś wartości (tylko operator porównania) ⚠️.

Jeżeli na przykład sprawdzamy czy liczba mieści się w określonym przedziale, wtedy nie możemy tego użyć, ponieważ to określa jedną z wielu możliwości i kompilator nie dopuści do przetworzenia tej konstrukcji ❌. To jest zasada wynikająca z samej konstrukcji, aczkolwiek niektóre języki programowania mogą zezwalać na wyrażenia wykraczające poza sprawdzanie równości np. C# 👍. Wtedy najlepiej sprawdzić czy standard języka to umożliwia.

Przechodzimy do prezentacji budowy samej instrukcji w kodzie źródłowym 🎬!

JAK UTWORZYĆ INSTRUKCJĘ "SWITCH" W PROGRAMOWANIU?

Instrukcja "switch" dzieli się na elementy obowiązkowe i poboczne, więc najpierw przedstawię to, co jest wymagane, aby zapis był poprawny, a potem przejdziemy do całej reszty.

Tak wygląda najprostsza postać i najczęściej spotykana w językach programowania 👇:

switch ([wartość całkowitoliczbowa/znakowa/typu wyliczeniowego])
{
	case A:
		[instrukcje]
		break;
	
	case B:
		[instrukcje]
		break;
}

Przeanalizujmy całość 🔍.

W pierwszej kolejności piszemy słowo "switch". Następnie tworzymy parę nawiasów okrągłych i w ich środku wpisujemy wartość jaką chcemy zbadać pod kątem przyjmowania pewnej konkretnej wartości. Konkretnej, to znaczy: równa 23, równa małej literce 'p' itd. Nie możemy tu umieścić warunku w stylu: liczby od 1 do 6 🚫. Trzeba pamiętać o tym istotnym ograniczeniu.

W tym miejscu umieszczamy nawiasy klamrowe, tak jak dla każdego innego bloku kodu przynależnego do jakiejś konstrukcji. W środku nich jest miejsce dla rozpatrywania pojedynczych przypadków, tyle ile potrzebujemy. Te charakterystyczne wcięcia nie są konieczne (ich brak nie będzie uznany za błąd), jednak warto je pisać w taki sposób, bo to podkreśla do którego przypadku należą dane instrukcje ✅.

Tak wygląda całość instrukcji "switch", a teraz przejdę do wyjaśnienia samego bloku ze słowem "case" ⏩.

JAK UTWORZYĆ BLOK DLA POJEDYNCZEGO PRZYPADKU W INSTRUKCJI "SWITCH"?

Każdy z przypadków z osobna jaki ma zostać zbadany w instrukcji "switch", tworzymy poprzez następujący ciąg 👇:

  1. słowo kluczowe "case" (ang. w przypadku),
  2. konkretna stała wartość całkowitoliczbowa, znakowa bądź typu wyliczeniowego ("enum"),
  3. znak dwukropka (ważna rzecz, gdyż to jest część składni i bez tego kompilator zgłosi błąd ❌),
  4. instrukcje jakie mają się wykonać w przypadku spełnienia tego przypadku (może być wiele i każda z nich zakończona średnikiem),
  5. słowo kluczowe "break" tym razem zakończone średnikiem (tu jest ukryta pułapka, którą wyjaśniam niżej!).

Tak brzmi najczęściej spotykana forma, która może wyglądać zupełnie inaczej w zależności od języka programowania (o ile wspiera instrukcję "switch" ⚠️). Teraz wyjaśnię dlaczego trzeba cholernie uważać przy słowie kluczowym "break" 💥!

JAK DZIAŁA SŁOWO KLUCZOWE "BREAK" W INSTRUKCJI "SWITCH"?

Słowo kluczowe "break" opisałem dokładniej w odrębnym artykule, a jednym z jego znaczeń jest oznaczenie "końca" instrukcji do wykonania dla pojedynczego przypadku w instrukcji "switch" 🚧. W przypadku tego występowania, jest ono bardzo podchwytliwe i potrafi zaburzyć oczekiwane działanie programu, jeśli zapomnimy go wstawić 🔥!

Całe zaskoczenie polega na tym, że to tak naprawdę nie jest obowiązkowy element składni! Budując blok "case" dla danego przypadku, możesz go pominąć 👇:

case A:
	[instrukcje]

case B:
	[instrukcje]

i to też się skompiluje. Natomiast to niesie za sobą ukryte konsekwencje 💥!

Gdy podczas działania programu, przypadek zostanie spełniony i dojdzie do wykonania instrukcji, a nie będzie słowa "break" na samym końcu, to program wykona również wszystkie kolejne bloki "przechodząc" przez kolejne hasła "case", aż do natrafienia na najbliższe słowo "break" albo do końca instrukcji "switch" 😮!

Jeżeli nie jesteś świadomy(-a) tej pułapki, to może Cię przyblokować na sporą ilość czasu zanim dojdziesz do tego, że zabrakło wstawienia słowa "break" ⚠️! Dlatego tak ważne jest, aby nie zapominać o dodaniu "break", które informuje gdzie jest granica pomiędzy jednym przypadkiem, a drugim.

CZY MOŻNA SPRAWIĆ, ABY JEDEN BLOK INSTRUKCJI OBSŁUGIWAŁ WIELE PRZYPADKÓW W INSTRUKCJI "SWITCH"?

Jest to dozwolone ✅. Jeżeli chcesz, aby dwie konkretne wartości odnosiły się do tego samego bloku instrukcji, to wystarczy dopisać wiele razy sam wiersz ze słowem "case" jeden pod drugim, w taki sposób 👇:

case A:
case B:
	[instrukcje]

To będzie oznaczało, że ten sam ciąg instrukcji wykona się w przypadku, gdy wartość jest równa A lub wartość jest równa B (alternatywa) 👍. Stosując instrukcję warunkową, to będzie oznaczało dokładnie to samo 👇:

if(x == A || x == B)
{
	[instrukcje]
}

Tyle w tym punkcie 😊.

JAK W INSTRUKCJI "SWITCH" DODAĆ BLOK INSTRUKCJI, GDY NIE JEST SPEŁNIONY ŻADEN PRZYPADEK?

Jeżeli chcesz, aby w instrukcji "switch" były zawarte instrukcje dla sytuacji niespełnienia żadnego z określonych przypadków, to możesz skorzystać ze słowa kluczowego "default" i utworzyć blok instrukcji w taki sam sposób, jak z użyciem hasła "case", tylko że wtedy nie wpisujemy żadnej wartości zaraz po słowie kluczowym 👇:

default:
	[instrukcje]

To też warto wiedzieć, że od tej strony jeszcze nie jesteśmy ubezwłasnowolnieni 😉.

Została jeszcze jedna część do wyjaśnienia 👀!

JAK UTWORZYĆ INSTRUKCJĘ "SWITCH" DLA TYPU WYLICZENIOWEGO?

Możesz skorzystać z instrukcji "switch" dla zmiennych typu wyliczeniowego ("enum") i wcale tak bardzo się to nie różni od budowy dla wartości całkowitoliczbowych, tylko zamiast liczb wstawiamy przypadki przyjmowania jednej z wartości typu wyliczeniowego 🚀:

switch (enumValue)
{
	case MyEnum.A:
		[instrukcje]
		break;
	
	case MyEnum.B:
		[instrukcje]
		break;
}

Takie podejście daje dwie duże zalety 👇:

  1. opieramy się na nazwach, a nie liczbach, które nic nam nie mówią,
  2. w przypadku modyfikacji wartości (albo ich kolejności), nie grozi nam konieczność aktualizacji we wszystkich instrukcjach "switch".

Typ wyliczeniowy świetnie współgra z instrukcją "switch" i razem połączone potrafią znacznie zwiększyć jakość kodu 📈!

CZY INSTRUKCJA "SWITCH" WYSTĘPUJE W KAŻDYM JĘZYKU PROGRAMOWANIA?

Nie każdy język programowania posiada instrukcję "switch" 🔒. Na przykład języki Python czy Lua nie mają tej konstrukcji i wtedy pozostaje Ci jedynie budowa rozgałęzień w postaci instrukcji warunkowej 😐. Natomiast większość języków wspiera instrukcję wielokrotnego wyboru i jeżeli sytuacja Ci na to pozwala, to jak najbardziej warto z tego korzystać ✔️.

Opisałem chyba wszystkie zagadnienia jakie dotyczą instrukcji "switch", więc na koniec został prosty przykład użycia!

PRZYKŁAD UŻYCIA INSTRUKCJI "SWITCH" W PROGRAMOWANIU

Przykład jaki przygotowałem dotyczy poproszenia użytkownika o wprowadzenie jednego z czterech znaków przeznaczonych dla operacji arytmetycznych: dodawanie, odejmowanie, mnożenie i dzielenie. Zależnie od podanego znaku, chcemy wyświetlić informację jaki to operator, a jeżeli wprowadzono cokolwiek innego, to aby był o tym osobny komunikat. To w języku C możemy wykonać to w taki sposób 👇:

#include <stdio.h>

int main(void)
{
	char character;

	printf("Podaj znak operatora arytmetycznego (+, -, *, /): ");
	scanf("%c", &character);

	switch (character)
	{
		case '+':
			printf("Operator dodawania\n");
			break;
		
		case '-':
			printf("Operator odejmowania\n");
			break;

		case '*':
			printf("Operator iloczynu\n");
			break;

		case '/':
			printf("Operator ilorazu\n");
			break;

		default:
			printf("Wprowadzono inny znak\n");
			break;
	}

	return 0;
}

Na samym początku deklarujemy zmienną typu znakowego celem późniejszego przechwycenia przez funkcję pobierającą wprowadzony znak z klawiatury (deklaracja oznacza, że na ten moment nie przypisujemy żadnej wartości). Następnie korzystamy z funkcji "printf" do wyświetlenia komunikatu o podaniu jednego ze znaków oznaczających operator arytmetyczny. Zaraz po nim znajduje się kolejne wywołanie funkcji, tym razem "scanf" za pomocą której, pobieramy znak z klawiatury (a pisząc poprawniej ze strumienia wejściowego, bo pobieranie wartości nie ogranicza się tylko do klawiatury 😉).

W tym miejscu mamy instrukcję "switch", w której pobieramy wprowadzony znak i badamy go pod kątem wszystkich czterech przypadków 🔍. Bierzemy pod uwagę również sytuację, gdy znak okaże się inny niż którymkolwiek z czterech podanych (blok z hasłem "default"). Kiedy uruchomimy sobie ten program, to ujrzymy komunikat i oczekiwanie od nas wprowadzenia znaku z klawiatury ⏏️. Następnie pojawi się wiadomość, która będzie zależeć od tego, jaki znak zostanie wprowadzony. Dla każdego z czterech operatorów pojawi się inna treść, a dla każdego innego znaku wyświetli się odrębny komunikat.

Instrukcja "switch" w programowaniu

Instrukcja "switch" jest alternatywną konstrukcją do rozbudowanych instrukcji warunkowych, w której określa się blok instrukcji do wykonania dla wielu przypadków naraz. Istotną jej wadą jest ograniczenie warunków tylko do sprawdzania czy zmienna przyjmuje określoną wartość (tylko sprawdzanie równości).


Koniec. Instrukcja "switch" jest wartym uwagi tematem do przyswojenia, tylko trzeba uważać, aby się nie skaleczyć 🙂.

PODOBNE ARTYKUŁY