Switch

ksnake

Instrukcja wyboru switch to tzw. zwrotnica wielokierunkowa. Instrukcja ta pozwala na zdefiniowanie działań dla różnych wyników jednego wyrażenia.

Jej konstrukcja pozwala na łatwiejsze od zwykłej pętli definiowanie przypadków (większej ich liczby). Wygląda ona następująco:

switch(wyrażenie_kluczowe)
{
  case wartosc_1: 
    instrukcje; 
  break;
  
  case wartosc_2: 
    instrukcje;
  break;

  // ...
 
  default:
    cout << "Błąd"; 
}

Jak widać instrukcja jest dosyć prosta i można jej używać dla każdego działania zwracającego wartości wyliczeniowe (znak, liczba całkowita).

Instrukcja Break potrzebna jest na końcu każdej szufladki. Jeżeli jej nie będzie, automatycznie wykona się kolejna szufladka. Nie jest ona natomiast wymagane, jeżeli szufladka jest ostatnią.

Case to tzw. szufladka. Szufladki nie mogą mieć takich samych wartości i nie muszą być wypisywane w jakim kolwiek porządku.

Wariant Default nie jest wymagany i realizuje się on wtedy gdy wartość_kluczowa nie pasuje do żadnej z szufladek. Default nie musi być ostatnią zakładką jednak wtedy musi zawierać instrukcję break.

Operować instrukcją Switch można np. na typach Integer czy Chararcter. Nie można natomiast przekazywać typu np. String - kompilator zwróci błąd o niezgodności typu przekazanego do instrukcji.

Przykłady

```cpp #include <iostream> using namespace std;

int main()
{
int liczba;
cout << "Podaj liczbe: ";
cin >> liczba;
cout << endl;

switch(liczba)
{
case 2: cout << "Dwa"; break;
case 4: cout << "Cztery"; break;
case 8: cout << "Osiem"; break;
default: cout << "Iles tam :)";
}
}


Przykład dla okna dialogowego [[WinAPI/MessageBox]]:

```cpp
#include <windows.h>

switch(MessageBox(NULL,"Jakiś text","Jakiś tytuł",MB_ABORTRETRYIGNORE+MB_ICONEXCLAMATION))
{
  case IdAbort: MessageBox(NULL,"Wybrałeś Przerwij","Wynik",MB_OK); break;

  case IdRetry: MessageBox(NULL,"Wybrałeś Ponów","Wynik",MB_OK); break;

  case IdIgnore: MessageBox(NULL,"Wybrałeś Ignoruj","Wynik",MB_OK); break;

  default: MessageBox(NULL,"Wartość błędna","Wynik",MB_OK);
}

Zobacz też:

6 komentarzy

A co jeśli chcę połączyć w switch'u błąd wprowadzania liter z błędem zakresu liczbowego? Przy czym zakładam, że mam menu od 1 do 5.

na dole punkcie "zobacz też" jest odnośnik do "case" z kolei case ma przekierowanie na switch
czyli dałes link strony do samej siebie :)
link do default też jest bezsensu
case default i switch wszsystkie powinny wskazywac na ten sam tekst mówiący o instrukcji switch

ok, virus, to popraw :P

Instrukcja 'break' nie jest wymagane, gdyż nie zostanie wykonana następna szufladka. Jeśli kompilator nie napotka instrukcji break, PRZEANALIZUJE kolejne zakładki (czyli najpierw sprawdza, czy spełniają warunek), a jeśli tak, to je wykona. Inną żeczą są szufladki bezwarunkowe, które wykonuje się zawsze, jeśli zastała wykonana poprzednia szufladka (np. po prostu case: wykonaj()). Inną żeczą jest to, że jeśli kompilator ni napotka instrukcji break, wykona szufladkę "default:" która teoretycznie powinna być wykonywana kiedy żadna z poprzednich zakładek nie została wykonana (czyli jeśli wcześniej nie przerwano instrukcji 'switch' instrukcją 'break'). Ponadto powinieneś najpierw umieścić definicję szufladki, a potem dopiero używać tego słowa (lepiej się wtedy czyta jak nie wie się o co chodzi, nawet ja, mimo że wiem co to 'switch', nie wiedziałem pierwotnie o czym mowa, bo nie spotkałem się nigdy z określeniem szufladka). W trzech słowach- artykół do poprawy.

Masz rację, mój błąd. Przynajmniej stringów nie można... A napisałem tak dlatego, że gdy dawałem stringa, to otrzymałem takie błędy:
hello.cpp:11: error: switch quantity not an integer
Pomysłkę usunąłem.

Czemu tylko integer?
Nie mogę np. chararcter?
np.

char znak;
cin >> znak;
switch(znak)
{
case 'e' : jakas_fukcja();
break;
default: cos_innego();
break;
}