switch
Instrukcja (C)
Instrukcje switch
i case
ułatwiają kontrolowanie złożonych operacji warunkowych i rozgałęziania. Instrukcja switch
przenosi kontrolkę do instrukcji w jej treści.
Składnia
selection-statement
:
switch (
expression
)
statement
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
Uwagi
Instrukcja powoduje, że kontrolka switch
jest przekazywana do jednej labeled-statement
w treści instrukcji, w zależności od wartości expression
.
expression
Wartości i każdy constant-expression
musi mieć typ całkowity. Element constant-expression
musi mieć jednoznaczną stałą wartość całkowitą w czasie kompilacji.
Kontrolka przechodzi do instrukcji case
, której constant-expression
wartość odpowiada wartości expression
. Instrukcja switch
może zawierać dowolną liczbę case
wystąpień. Jednak żadna z dwóch constant-expression
wartości w tej samej instrukcji nie może mieć tej samej switch
wartości. Wykonanie treści instrukcji switch
rozpoczyna się od pierwszej instrukcji w lub po dopasowaniu labeled-statement
. Wykonanie jest kontynuowane do końca treści lub do momentu break
, aż instrukcja przenosi kontrolę poza treść.
Użycie instrukcji switch
zwykle wygląda mniej więcej tak:
switch ( expression )
{
// declarations
// . . .
case constant_expression:
// statements executed if the expression equals the
// value of this constant_expression
break;
default:
// statements executed if expression does not equal
// any case constant_expression
}
Instrukcję break
można użyć do zakończenia przetwarzania określonej instrukcji oznaczonej etykietą w instrukcji switch
. Odgałęzienia na końcu instrukcji switch
. Bez break
programu program kontynuuje kolejną instrukcję oznaczoną etykietą, wykonując instrukcje do momentu osiągnięcia wartości lub break
końca instrukcji. Ta kontynuacja może być pożądana w niektórych sytuacjach.
Instrukcja jest wykonywana, jeśli żadna default
wartość nie case
constant-expression
jest równa wartości expression
. Jeśli nie ma default
instrukcji i nie case
znaleziono dopasowania, żadna z instrukcji w switch
treści nie zostanie wykonana. Może istnieć co najwyżej jedna default
instrukcja. Instrukcja default
nie musi nadejść na końcu. Może się pojawić w dowolnym miejscu w treści instrukcji switch
. Etykieta case
lub default
może być wyświetlana tylko wewnątrz instrukcji switch
.
Typ switch
expression
i case
constant-expression
musi być całkowity. Wartość każdej z nich case
constant-expression
musi być unikatowa w treści instrukcji.
Etykiety case
switch
i default
treści instrukcji są istotne tylko w początkowym teście, który określa, gdzie rozpoczyna się wykonywanie w treści instrukcji. switch
instrukcje mogą być zagnieżdżone. Wszystkie zmienne statyczne są inicjowane przed wykonaniem w dowolnej switch
instrukcji.
Uwaga
Deklaracje mogą pojawiać się na czele instrukcji złożonej tworzącej switch
treść, ale inicjacje zawarte w deklaracjach nie są wykonywane. Instrukcja switch
przenosi kontrolkę bezpośrednio do instrukcji wykonywalnego w treści, pomijając wiersze zawierające inicjacje.
Poniższe przykłady ilustrują instrukcje switch
:
switch( c )
{
case 'A':
capital_a++;
case 'a':
letter_a++;
default :
total++;
}
Wszystkie trzy instrukcje switch
treści w tym przykładzie są wykonywane, jeśli c
jest równe 'A'
, ponieważ żadna instrukcja nie break
jest wyświetlana przed następującą case
instrukcją . Kontrolka wykonywania jest przenoszona do pierwszej instrukcji (capital_a++;
) i jest kontynuowana w kolejności przez pozostałą część treści. Jeśli c
wartość jest równa 'a'
, letter_a
i total
są zwiększane. Wartość jest zwiększana tylko total
wtedy, gdy c
wartość nie jest równa 'A'
lub 'a'
.
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
W tym przykładzie instrukcja jest zgodna break
z każdą instrukcją switch
treści. Instrukcja break
wymusza wyjście z treści instrukcji po wykonaniu jednej instrukcji. Jeśli i
wartość jest równa -1, tylko n
jest zwiększana. Poniższa break
instrukcja n++;
powoduje, że kontrolka wykonywania jest pomijana z treści instrukcji, pomijając pozostałe instrukcje. Podobnie, jeśli i
wartość jest równa 0, tylko z
jest zwiększana; jeśli i
jest równa 1, tylko p
jest zwiększana. Ostateczna break
instrukcja nie jest ściśle niezbędna, ponieważ kontrola przechodzi poza treść na końcu instrukcji złożonej. Jest on uwzględniony w celu zapewnienia spójności.
Pojedyncza instrukcja może zawierać wiele case
etykiet, jak pokazano w poniższym przykładzie:
switch( c )
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : convert_hex(c);
}
W tym przykładzie, jeśli constant-expression
równa się dowolna litera między 'a'
i 'f'
, funkcja jest wywoływana convert_hex
.
specyficzne dla firmy Microsoft
Język Microsoft C nie ogranicza liczby case
wartości w instrukcji switch
. Liczba jest ograniczona tylko przez dostępną pamięć. Język ANSI C wymaga, aby co najmniej 257 case
etykiet było dozwolonych w instrukcji switch
.
Dla default firmy Microsoft C jest to, że rozszerzenia firmy Microsoft są włączone. Użyj opcji /Za kompilatora, aby wyłączyć te rozszerzenia.