Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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-statementopt C++17condition)statement
init-statement:
expression-statement
simple-declaration
condition:
expression
attribute-specifier-seqoptdecl-specifier-seqdeclaratorbrace-or-equal-initializer
labeled-statement:
caseconstant-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.
Treść switch instrukcji składa się z serii case etykiet i opcjonalnej default etykiety. 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 caseconstant-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 switchelementu , w tym , defaultjest wykonywana. Na 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 c jest wielką literą 'A'. 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 jest małą literą 'a', lowercase_a jest zwiększana, a break instrukcja kończy switch treść instrukcji. 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;
}
/std:c++17): 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. Na 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ęć.