Поделиться через


switch оператор (C++)

Позволяет выбирать между несколькими разделами кода в зависимости от значения целочисленного выражения.

Синтаксис

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

Замечания

Оператор 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 . Это число ограничивается только объемом доступной памяти.

См. также

Операторы выбора
Ключевые слова