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-statementoptC++17condition)statement

init-statement:
expression-statement
simple-declaration

condition:
expression
attribute-specifier-seqopt decl-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 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. 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ż

Instrukcje wyboru
Słowa kluczowe