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-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
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 case
constant-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 case
switch
popisku 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 while
uppercase_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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro