switch
instrukcja (C++)
Umożliwia wybór między wieloma sekcjami kodu w zależności od wartości wyrażenia całkowitego.
Składnia
selection-statement
:
switch
(
init-statement
optC++17condition
)
statement
init-statement
:
expression-statement
simple-declaration
condition
:
expression
attribute-specifier-seq
optdecl-specifier-seq
declarator
brace-or-equal-initializer
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 condition
.
Musi condition
mieć typ całkowity lub być typem klasy, który ma jednoznaczną konwersję na typ całkowity. Promocja całkowita odbywa się zgodnie z opisem w temacie Konwersje standardowe.
switch
Treść instrukcji składa się z serii case
etykiet i optetykiety ionaldefault
. A labeled-statement
jest jedną z tych etykiet i instrukcji, które następują. Instrukcje oznaczone etykietą nie są wymaganiami składniowym, ale switch
instrukcja jest bez nich bez znaczenia. Nie ma dwóch constant-expression
wartości w case
instrukcjach, które mogą mieć taką samą wartość. Etykieta może być wyświetlana default
tylko raz. Instrukcja default
jest często umieszczana na końcu, ale może być wyświetlana w dowolnym miejscu w treści instrukcji switch
. Etykieta case
lub default
może być wyświetlana tylko wewnątrz instrukcji switch
.
Etykieta constant-expression
w każdej case
etykiecie jest konwertowana na wartość stałą, która jest tego samego typu co condition
. Następnie jest porównywany z condition
równością. Kontrolka przechodzi do pierwszej instrukcji po case
constant-expression
wartości zgodnej z wartością condition
. Wynikowe zachowanie przedstawiono w poniższej tabeli.
switch
zachowanie instrukcji
Stan | Akcja |
---|---|
Przekonwertowana wartość jest zgodna z wartością promowanego wyrażenia sterującego. | Kontrolka jest przekazywana do instrukcji następującej po tej etykiecie. |
Żadna ze stałych nie pasuje do stałych w case etykietach; etykieta default jest obecna. |
Kontrolka jest przenoszona default do etykiety. |
Żadna ze stałych nie pasuje do stałych w case etykietach; żadna etykieta nie default jest obecna. |
Kontrolka jest przekazywana do instrukcji po instrukcji switch . |
Jeśli zostanie znalezione zgodne wyrażenie, wykonanie może być kontynuowane później case
lub default
przez etykiety. Instrukcja break
służy do zatrzymywania wykonywania i transferu kontroli do instrukcji po instrukcji switch
. break
Bez instrukcji każda instrukcja z dopasowanej case
etykiety na końcu switch
elementu , w tym , default
jest wykonywana. Przykład:
// switch_statement1.cpp
#include <stdio.h>
int main() {
const char *buffer = "Any character stream";
int uppercase_A, lowercase_a, other;
char c;
uppercase_A = lowercase_a = other = 0;
while ( c = *buffer++ ) // Walks buffer until NULL
{
switch ( c )
{
case 'A':
uppercase_A++;
break;
case 'a':
lowercase_a++;
break;
default:
other++;
}
}
printf_s( "\nUppercase A: %d\nLowercase a: %d\nTotal: %d\n",
uppercase_A, lowercase_a, (uppercase_A + lowercase_a + other) );
}
W powyższym przykładzie wartość jest zwiększana, uppercase_A
jeśli jest górna'A'
case.c
Instrukcja break
po uppercase_A++
zakończeniu switch
wykonywania treści instrukcji i kontrolki while
przechodzi do pętli. Bez instrukcji break
wykonanie "przepadnie" do następnej instrukcji oznaczonej etykietą, tak aby lowercase_a
i other
również było zwiększane. Podobny cel jest obsługiwany przez instrukcję break
dla case 'a'
. Jeśli c
wartość jest niższacase'a'
, jest zwiększana, lowercase_a
a break
instrukcja kończy treść instrukcji switch
. Jeśli c
nie jest elementem 'a'
lub 'A'
, default
instrukcja jest wykonywana.
Program Visual Studio 2017 lub nowszy (dostępny w /std:c++17
trybie i nowszych): [[fallthrough]]
atrybut jest określony w standardzie C++17. Można go użyć w instrukcji switch
. Jest to wskazówka dla kompilatora lub każda osoba, która odczytuje kod, że zachowanie fall-through jest zamierzone. Kompilator języka Microsoft C++ obecnie nie ostrzega przed zachowaniem fallthrough, więc ten atrybut nie ma wpływu na zachowanie kompilatora. W tym przykładzie atrybut zostanie zastosowany do pustej instrukcji w nieokreślonej instrukcji oznaczonej etykietą. Innymi słowy, średnik jest niezbędny.
int main()
{
int n = 5;
switch (n)
{
case 1:
a();
break;
case 2:
b();
d();
[[fallthrough]]; // I meant to do this!
case 3:
c();
break;
default:
d();
break;
}
return 0;
}
Program Visual Studio 2017 w wersji 15.3 lub nowszej (dostępny w /std:c++17
trybie i nowszych): switch
instrukcja może zawierać klauzulę init-statement
kończącą się średnikiem. Wprowadza i inicjuje zmienną, której zakres jest ograniczony do bloku instrukcji switch
:
switch (Gadget gadget(args); auto s = gadget.get_status())
{
case status::good:
gadget.zip();
break;
case status::bad:
throw BadGadget();
};
Wewnętrzny blok instrukcji switch
może zawierać definicje z inicjatorami, o ile są one osiągalne, czyli nie pomijane przez wszystkie możliwe ścieżki wykonywania. Nazwy wprowadzone przy użyciu tych deklaracji mają zakres lokalny. Przykład:
// switch_statement2.cpp
// C2360 expected
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
switch( tolower( *argv[1] ) )
{
// Error. Unreachable declaration.
char szChEntered[] = "Character entered was: ";
case 'a' :
{
// Declaration of szChEntered OK. Local scope.
char szChEntered[] = "Character entered was: ";
cout << szChEntered << "a\n";
}
break;
case 'b' :
// Value of szChEntered undefined.
cout << szChEntered << "b\n";
break;
default:
// Value of szChEntered undefined.
cout << szChEntered << "neither a nor b\n";
break;
}
}
Instrukcję switch
można zagnieżdżać. Po zagnieżdżeniu case
etykiety lub default
są skojarzone z najbliższą switch
instrukcją, która je otacza.
Zachowanie 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ęć.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla