switch
оператор (C++)
Позволяет выбирать между несколькими разделами кода в зависимости от значения целочисленного выражения.
Синтаксис
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
Замечания
Оператор switch
передает управление одному из labeled-statement
в своем теле в зависимости от значения condition
.
Должен condition
иметь целочисленный тип или быть типом класса, который имеет однозначное преобразование в целочисленный тип. Целочисленное продвижение происходит, как описано в преобразованиях уровня "Стандартный".
Текст switch
инструкции case
состоит из ряда меток и optметки ional default
. Это labeled-statement
одна из этих меток и приведенные ниже инструкции. Помеченные операторы не являются синтаксическими требованиями, но switch
инструкция бессмысленна без них. Не два constant-expression
значения в case
инструкциях могут иметь одно и то же значение. default
Метка может отображаться только один раз. Оператор default
часто помещается в конец, но он может отображаться в любом месте текста switch
оператора. Метка case
или default
может располагаться только внутри оператора switch
.
Каждая constant-expression
метка преобразуется в case
постоянное значение, которое совпадает с типом condition
. Затем он сравнивается с condition
равенством. Элемент управления передается первому оператору после case
constant-expression
значения, соответствующего condition
значению. Поведение, полученное в результате, показано в следующей таблице.
switch
поведение оператора
Condition | Действие |
---|---|
Преобразованное значение соответствует значению выражения управления с повышенным уровнем. | Управление передается оператору, следующему за этой меткой. |
Ни одна из констант не соответствует константам в case метках; default метка присутствует. |
Элемент управления передается default в метку. |
Ни одна из констант не соответствует константам в case метках; метка отсутствует default . |
Элемент управления передается инструкции после инструкции switch . |
Если найдено соответствующее выражение, выполнение может продолжаться через более поздние case
или default
метки. Оператор break
используется для остановки выполнения и передачи элемента управления в инструкцию после инструкции switch
. break
Без инструкции выполняется каждая инструкция из соответствующей case
метки до концаswitch
, включая операторdefault
. Например:
// 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) );
}
В приведенном выше примере увеличивается, uppercase_A
если является верхним'A'
case.c
Оператор break
после uppercase_A++
завершения выполнения текста инструкции switch
и элемента управления передается в while
цикл. Без инструкции break
выполнение будет "переходить" к следующей помеченной инструкции, чтобы lowercase_a
other
инкрементироваться. Аналогичное назначение выполняется заявлением break
для case 'a'
. Если c
значение меньшеcase'a'
, увеличивается, lowercase_a
а оператор break
завершает текст инструкции switch
. Если c
это не или 'a'
'A'
default
оператор выполняется.
Visual Studio 2017 и более поздних версий (доступно в /std:c++17
режиме и более поздних версиях): [[fallthrough]]
атрибут указан в стандарте C++17. Его можно использовать в инструкции switch
. Это указание компилятору или любому, кто считывает код, что падающее поведение намеренно. Компилятор Microsoft C++ в настоящее время не предупреждает о поведении резервного руководства, поэтому этот атрибут не влияет на поведение компилятора. В примере атрибут применяется к пустой инструкции в нетерминированной инструкции с метками. Другими словами, необходима точка с запятой.
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 версии 15.3 и более поздних версий (доступных в /std:c++17
режиме и более поздних версиях): инструкция switch
может иметь init-statement
предложение, которое заканчивается точкой с запятой. Он вводит и инициализирует переменную, область которой ограничена блоком switch
инструкции:
switch (Gadget gadget(args); auto s = gadget.get_status())
{
case status::good:
gadget.zip();
break;
case status::bad:
throw BadGadget();
};
Внутренний блок инструкции switch
может содержать определения с инициализаторами до тех пор, пока они доступны, то есть не обходятся всеми возможными путями выполнения. Имена, добавленные с помощью этих объявлений, имеют локальную область видимости. Например:
// 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;
}
}
Оператор switch
может быть вложен. При вложении case
default
метки связываются с ближайшей switch
инструкцией, которая заключает их.
Поведение в системах Майкрософт
Microsoft C++ не ограничивает количество значений case
в инструкции switch
. Это число ограничивается только объемом доступной памяти.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по