switch оператор (C++)
Позволяет выбирать между несколькими разделами кода в зависимости от значения целочисленного выражения.
Синтаксис
selection-statement :
switch ( init-statement opt C++17 condition ) statement
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 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 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 break; case 'b' : // Value of szChEntered undefined. cout >
Оператор switch может быть вложен. При вложении case default метки связываются с ближайшей switch инструкцией, которая заключает их.
Поведение в системах Майкрософт
Microsoft C++ не ограничивает количество значений case в инструкции switch . Это число ограничивается только объемом доступной памяти.
Оператор Switch
Оператор switch принимает в качестве аргумента число, и в зависимости от его значения выполняет те или иные команды.
switch () < case : [case : ] [default: ] >
Если значение переменной не соответствует ни одному case, то выполняется default ветвь. Она может отсутствовать, тогда вообще ничего не выполняется.
В примере выше каждая ветвь оканчивается оператором break. Это важно. Когда компьютер видит оператор break, он выходит из оператора switch. Если бы он отсутствовал, то программа «провалилась» бы дальше, и стала выполнять следующие ветви.
#include #include int main() < unsigned day; printf("Enter day "); scanf("%d", &day); if (day >7) < day = day % 7; >switch (day) < case 0: printf("Sunday"); case 1: printf("Monday"); case 2: printf("Tuesday"); case 3: printf("Wednesday"); case 4: printf("Thursday"); case 5: printf("Friday"); default: printf("Saturday"); >getch(); >
Введите значение, например 3, и вы увидите, что программа выведет
WednesdayThursdayFridaySaturday то есть все ветви, после найденной.
Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше). Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные. Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.
#include #include #include int main() < float a, b, c; char op; scanf("%f %c %f", &a, &op, &b); switch (op) < case '+': < c = a + b; break; >case '-': < c = a - b; break; >case '/': < if (b != 0.0) < c = a / b; >else < printf("Error: divide by zero"); getch(); exit(1); >break; > case '*': < c = a * b; break; >default: printf("No operation defined"); getch(); exit(1); > printf("%.6f", c); getch(); >
Если ввести
1 + 2
то будет выведен результат операции 1 + 2 = 3
Хочу обратить внимание, что литеры типа ‘+’ и т.п. воспринимаются в качестве чисел, поэтому их можно использовать в операторе switch. В этой программе использовалась функция exit из библиотеки stdlib. Функция останавливает работу программы и возвращает результат её работы. Если возвращается истина (ненулевое значение), то это значит, что программа была выполнена с ошибкой.
Ветвь default может располагаться в любом месте, не обязательно в конце. Этот код также будет нормально работать
switch (day)
default здесь также нуждается в операторе break, как и другие ветви, иначе произойдёт сваливание вниз. Несмотря на то, что так можно писать, это плохой стиль программирования. Ветвь default логически располагается в конце, когда других вариантов больше нет.
Возможные значения аргумента оператора switch могут располагаться в любом порядке, но должны быть константными значеними. Это значит, что следующий код не заработает
#include #include #include int main() < //Это, конечно, константа, но не может быть использована как //значение для оператора switch const int monday = 0; unsigned day; printf("Enter day "); scanf("%d", &day); if (day >7) < day = day % 7; >switch (day) < case monday: printf("Sunday"); break; case 1: printf("Monday"); break; case 2: printf("Tuesday"); break; case 3: printf("Wednesday"); break; case 4: printf("Thursday"); break; default: printf("Saturday"); break; case 5: printf("Friday"); break; >getch(); >
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev students

Всё ещё не понятно? – пиши вопросы на ящик
Case c что это
Конструкция switch-case позволяет сравнить некоторое выражение с набором значений. Она имеет следующую форму:
switch(выражение)
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями после оператора сase . И если совпадение будет найдено, то будет выполняться определенный блок сase .
Стоит отметить, что сравниваемое выражение в switch должно представлять один из целочисленных или символьных типов или перечисление (рассматриваются далее).
В конце конструкции switch может стоять блок default . Он необязателен и выполняется в том случае, если значение после switch не соответствует ни одному из операторов case. Например:
#include int main() < int x ; switch(x) < case 1: std::cout >
Чтобы избежать выполнения последующих блоков case/default, в конце каждого блока ставится оператор break . То есть в данном случае будет выполняться оператор
case 2: std::coutПосле выполнения оператора break произойдет выход из конструкции switch..case, и остальные операторы case будут проигнорированы. Поэтому на консоль будет выведена следующая строка
x = 2Стоит отметить важность использования оператора break . Если мы его не укажем в блоке case , то после этого блока выполнение перейдет к следующему блоку case. Например, уберем из предыдущего примера все операторы break:
#include int main() < int x ; switch(x) < case 1: std::cout >В этом случае опять же будет выполняться оператор case 2: , так как переменная x=2. Однако так как этот блок case не завершается оператором break, то после его завершения будет выполняться набор инструкций после case 3: даже несмотря на то, что переменная x по прежнему равна 2. В итоге мы получим следующий консольный вывод:
x = 2 x = 3 x is undefinedСовмещение условий
Можно определять для нескольких меток case один набор инструкций:
#include int main() < int x ; switch(x) < case 1: case 2: std::cout >Переменные в блоках case
Определение переменных в блоках case , возможно, встречается нечасто. Однако может вызвать затруднения. Так, если переменная определяется в блоке case, то все инструкции блока помещаются в фигурные скобки (для блока default это не требуется):
#include int main() < int x ; switch(x) < case 1: < int a; std::cout case 2: < int b; std::cout default: int c; std::cout >Блок switch с инициализацией переменной
Иногда в конструкции switch для различных промежуточных вычислений необходимо определить переменную. Для этой цели начиная со стандарта C++17 язык С++ поддерживает особую форму конструкции switch :
switch(инициализация; выражение) < // . >Подобная форма также принимает выражение, значение которого сравнивается с константами после операторов case . Но теперь перед выражением еще может идти определение и инициализация переменной. Например:
#include int main() < char op = '+'; int n = 10; switch(int k; op) < case '+': std::cout >В данном случае в конструкции switch определяется переменная k , которая доступна только в рамках этой конструкции switch . В качестве выражения используется значение переменной op , которая представляет знак операции. И в зависимости от этого значения, выполняем определенную операцию с переменными n и k.
Оператор switch (C)
Операторы switch и case помогают управлять сложными условными операциями и операциями ветвления. Оператор switch передает управление в оператор внутри своего тела.
Синтаксис
selection-statement :
switch ( expression ) statementlabeled-statement :
case constant-expression : statement
default : statementКомментарии
Оператор switch передает управление одному из labeled-statement в своем теле в зависимости от значения expression .
Значения expression и значение каждого constant-expression должны иметь целочисленный тип. Выражение constant-expression должно иметь однозначное константное целочисленное значение во время компиляции.
Управление передается оператору case , значение constant-expression которого соответствует значению выражения expression . Оператор switch может содержать неограниченное число экземпляров case . Однако значения ни одной из пар выражений constant-expression в одном операторе switch не должны совпадать. Выполнение тела оператора switch начинается с первого соответствующего оператора labeled-statement или после него. Выполнение продолжается до конца тела оператора или пока оператор break не передаст управление за пределы тела.
Оператор switch обычно используется следующим образом:
switch ( expression ) < // declarations // . . . case constant_expression: // statements executed if the expression equals the // value of this constant_expression break; default: // statements executed if expression does not equal // any case constant_expression >Оператор break можно использовать для завершения обработки определенного оператора с меткой в операторе switch . Он выполняет ветвление до конца оператора switch . Без оператора break выполнение программы продолжается до следующего оператора с меткой. Операторы будут выполняться до достижения оператора break или конца всего оператора. В некоторых случаях может требоваться именно такое поведение.
Оператор default выполняется, если ни одно из значений case constant-expression не равно значению expression . Если оператор default не указан и соответствующий вариант case не найден, ни один из операторов в теле оператора switch не выполняется. Допускается не более одного оператора default . Оператор default не обязательно должен находиться в конце. Он может располагаться в любом месте тела оператора switch . Метка case или default может располагаться только внутри оператора switch .
Выражения switch expression и case constant-expression должны быть целочисленного типа. Значение каждого case constant-expression в теле оператора должно быть уникальным.
Метки case и default тела оператора switch имеют значения только при начальной проверке, которая определяет, с какого места тела оператора начинается выполнение. Операторы switch могут быть вложенными. Любые статические переменные инициализируются до выполнения любых операторов switch .
Объявления могут располагаться в начале составного оператора, образующего тело оператора switch , но инициализации, включенные в объявления, не выполняются. Оператор switch передает управление непосредственно на выполняемый оператор в теле, минуя все строки, содержащие инициализации.
В следующих примерах кода показаны операторы switch :
switch( c )В этом примере, если переменная c равна 'A' , выполняются все три оператора тела switch , так как оператор break перед следующим оператором case отсутствует. Управления передается первому оператору ( capital_a++; ) и продолжается по-порядку во всей остальной части тела. Если переменная c равна 'a' , увеличиваются значения переменных letter_a и total . Если переменная c не равна 'A' или 'a' , увеличивается только значение переменной total .
switch( i )В этом примере оператор break указан после каждого оператора тела switch . Оператор break вызывает принудительный выход из тела оператора после выполнения одного оператора. Если переменная i равна –1, увеличивается только значение переменной n . Оператор break после оператора n++; передает управление за пределы тела оператора, минуя оставшиеся операторы. Аналогично, если переменная i равна 0, увеличивается только значение переменной z ; если переменная i равна 1, увеличивается только значение переменной p . Заключительный оператор break , строго говоря, не требуется, так как управление передается из тела в конце составного оператора. Он добавлен для единообразия.
Один оператор может содержать несколько меток case , как показано в следующем примере:
switch( c )В этом примере, если constant-expression равно любой букве между 'a' и 'f' , convert_hex вызывается функция .
Специально для систем Майкрософт
Microsoft C не ограничивает количество значений case в операторе switch . Это число ограничивается только объемом доступной памяти. ANSI C требует, чтобы в операторе switch можно было использовать не менее 257 меток case .
В Microsoft C расширения Майкрософт по умолчанию (default) включены. Используйте параметр компилятора /Za для отключения этих расширений.