W przypadku gdy istnieje konieczność wyboru z kilku możliwości możemy skorzystać z instrukcji warunkowej if. W przypadku kilku możliwych przypadków do wyboru jest to wystarczające. Jeżeli jednak chcemy dokonać wyboru z kilkudziesięciu przypadków wielokrotne wykorzystanie instrukcji warunkowej if może nie być zbyt wygodnym rozwiązaniem. Aby ułatwić zapis takiego i podobnych przypadków, kiedy wybieramy jedną opcję z wielu, powstała instrukcja wielokrotnego wyboru, tzw. instrukcja switch. Instrukcja switch jest kolejną, po if-ach, instrukcją strukturalną, jaką poznajecie. Ale jest to pojedyncza instrukcja i wszędzie tam, gdzie składnia języka dopuszcza jedną instrukcję, możemy ją wstawić.
Składnia instrukcji switch: switch (selektor) { case wart_11 : case wart_12 : ... : case wart_1i : Instrukcja_1; break; case wart_21 : ... : case wart_2j : Instrukcja_2; break; ... case wart_n1 : ... : case wart_nm : Instrukcja_n; break; default : Instrukcja_inna; }
Ogólnie - instrukcja switch składa się z dowolnej liczby przypadków. Każdy z nich jest definiowany przez jedną lub więcej wartości selektora. Każdą z wartości selektora wymieniamy osobno po słowie kluczowym case; mogą więc one tworzyć całą listę wartości, do której przypisana jest jedna wspólna instrukcja stojąca po ostatnim dwukropku.
Selektor może być wyrażeniem jednego z typów porządkowych (przeliczalnych), tzn. może być typu int, bool, char, ale nie może być typu rzeczywistego ani typu string.
Poniżej przedstawiono prostą symulację, która demonstruje działanie instrukcji wielokrotnego wyboru switch.
Wybierz wartość zmiennej n i zobacz, jak działa instrukcja switch w C++ z animacją:
switch (n) { case 1: cout << "Case 1"; break; case 2: cout << "Case 2"; break; case 3: cout << "Case 3"; break; case 4: cout << "Case 4"; break; default: cout << "Default case";}
Na podsatwie symulacji możemy omówić działanie instrukcji switch. W zależności od wartości selektora, który jest umieszczony po instrukcji case zostaje wywołana dana grupa instrukcji występująca po dwukropku. Jeżeli wartość nie występuje po żadnym case to zostanie wykonany ciąg instrukcji, oddzielonych średnikami, znajdujący się po słowie default. Należy zaznaczyć, że w symulacji w każdym bloku instrukcji przypisanych do danej wartości selektora występuje instrukcja break. Instrukcja break powoduje przerwanie operacji switch oraz przejście do nawiasu zamykającego instrukcję wielokrotnego wyboru switch. Instrukcja break nie jest obligatoryjna. W przypadku gdy słowo break występuje, wykonana zostanie jedynie instrukcja przypisana do danej listy wartości. W przypadku gdy breaknie będzie, wykonana zostanie instrukcja przypisana do danej wartości i wszystkie następne instrukcje, włącznie z tą przypisaną do default- aż do napotkania breaklub końca instrukcji.
Każda z wartości selektora musi być jawnie wpisaną stałą (np. 5, true czy 'a') jednego typu lub wartością umożliwiającą jednoznaczne rzutowanie (np. zamiast znaku można podać jego kod w postaci liczby). Może być nawet wyrażeniem, ale takim, którego wartość można obliczyć na etapie kompilacji, czyli np. 2*2. Natomiast w żadnym razie nie mogą tutaj występować zmienne. Każda wartość (stała) może występować w wyrażeniu case tylko i wyłącznie raz.