Sdílet prostřednictvím


switch – příkaz (C++)

Umožňuje výběr mezi několika oddíly kódu v závislosti na hodnotě integrálního výrazu.

Syntaxe

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

Poznámky

Příkaz switch způsobí, že se ovládací prvek přenese do jednoho labeled-statement v těle příkazu v závislosti na hodnotě condition.

condition Musí mít celočíselný typ nebo typ třídy, který má jednoznačný převod na celočíselný typ. Celočíselné povýšení probíhá, jak je popsáno ve standardních převodech.

Tělo switch příkazu se skládá z řady case popisků a popisku optional default . A labeled-statement je jedním z těchto popisků a příkazů, které následují. Příkazy s popisky nejsou syntaktické požadavky, ale switch bez nich je příkaz bez významu. Žádné dvě constant-expression hodnoty v case příkazech se nesmí vyhodnotit na stejnou hodnotu. Popisek default se může zobrazit jenom jednou. Příkaz default se často umístí na konec, ale může se objevit kdekoli v switch těle příkazu. Uvnitř case příkazu se může objevit switch pouze popisek nebo default popisek.

V constant-expression každém case popisku se převede na konstantní hodnotu, která je stejného typu jako condition. Pak se porovnává s rovností condition . Ovládací prvek se předá prvnímu příkazu za caseconstant-expression hodnotou, která odpovídá hodnotě condition. Výsledné chování je znázorněno v následující tabulce.

switch chování příkazu

Podmínka Akce
Převedená hodnota odpovídá hodnotě upřednostněného řídicího výrazu. Ovládací prvek se přenese do příkazu, který následuje za tímto popiskem.
Žádná z konstant neodpovídá konstantám v case popiscích; default popisek je k dispozici. Ovládací prvek se přenese na default popisek.
Žádná z konstant neodpovídá konstantám v case popiscích. Žádný default popisek neexistuje. Ovládací prvek se přenese do příkazu za příkazem switch .

Pokud se najde odpovídající výraz, může provádění pokračovat později case nebo default popisky. Příkaz break se používá k zastavení provádění a přenosu řízení do příkazu za příkazem switch . break Bez příkazu se provede každý příkaz z odpovídajícího caseswitchpopisku na konec , včetně příkazu default. Příklad:

// 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) );
}

V předchozím příkladu se zvýší, uppercase_A pokud c je hornícase'A'. Příkaz break po ukončení provádění switch textu příkazu a řízení se předá do smyčky whileuppercase_A++. break Bez příkazu by provádění "propadlo" na další označený příkaz, takže lowercase_a by se také zvýší a other zvýší. Podobný účel je obsluhován prohlášením break pro case 'a'. Pokud c je nižšícase'a', lowercase_a zvýší se a break příkaz ukončí switch text příkazu. Pokud c není 'a' nebo 'A', příkaz default se spustí.

Visual Studio 2017 a novější (dostupné v /std:c++17 režimu a novější): Atribut [[fallthrough]] je zadaný ve standardu C++17. Můžete ho switch použít v příkazu. Je to nápověda kompilátoru nebo každému, kdo čte kód, který je úmyslný. Kompilátor jazyka Microsoft C++ v současné době nevaruje při pádovém chování, takže tento atribut nemá žádný vliv na chování kompilátoru. V příkladu se atribut použije na prázdný příkaz v rámci neukončeného popisku příkazu. Jinými slovy, středník je nezbytný.

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;
}

Visual Studio 2017 verze 15.3 a novější (dostupné v /std:c++17 režimu a novější): Příkaz switch může obsahovat init-statement klauzuli, která končí středníkem. Zavádí a inicializuje proměnnou, jejíž obor je omezen na blok switch příkazu:

    switch (Gadget gadget(args); auto s = gadget.get_status())
    {
    case status::good:
        gadget.zip();
        break;
    case status::bad:
        throw BadGadget();
    };

Vnitřní blok switch příkazu může obsahovat definice s inicializátory, pokud jsou dostupné, to znamená, že není vynecháno všemi možnými cestami provádění. Názvy zavedené pomocí těchto deklarací mají místní rozsah. Příklad:

// 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;
    }
}

Příkaz switch může být vnořený. Při vnoření case jsou popisky default přidruženy k nejbližšímu switch příkazu, který je uzavře.

Chování specifické pro Microsoft

Microsoft C++ neomezuje počet case hodnot v switch příkazu. Počet je omezen pouze dostupnou pamětí.

Viz také

Příkazy výběru
Klíčová slova