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

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

switch ( expression )
   case constant-expression : statement
   [default   : statement]

Заметки

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

Тело оператора switch состоит из ряда меток case и необязательной метки default. Никакие два константных выражения в операторах case не могут иметь одно и то же значение. Метка default может появляться только один раз. Операторы с меткой не являются синтаксическим требованием, однако без них инструкция switch не имеет значения. Оператор по умолчанию не всегда стоит в конце; он может отображаться в любой части оператора switch. Метка case или default может отображаться только внутри оператора switch.

Константное-выражение в каждой метке случая преобразуется в тип выражение и сравнивается с выражением на равенство. Управление передается оператору, у которого константное-выражение случая соответствует значению выражения. Поведение, полученное в результате, показано в следующей таблице.

Поведение оператора switch

Условие

Действие

Преобразованное значение соответствует значению выражения управления с повышенным уровнем.

Управление передается оператору, следующему за этой меткой.

Ни одна из констант не соответствуют константам в метках случаев; метка default присутствует.

Управление передается метке default.

Ни одна из констант не соответствуют константам в метках случаев; метка default не присутствует.

Управление передается оператору, следующему за оператором switch.

Если соответствующее выражение найдено, элементу управления не препятствуют последующие метки case или default. Оператор break используется для остановки выполнения и контроля передачи в оператор после оператора switch. Без оператора break будет выполнен каждый оператор из сопоставленной метки case в конце switch, включая default. Например:

// switch_statement1.cpp
#include <stdio.h>

int main() {
   char *buffer = "Any character stream";
   int capa, lettera, nota;
   char c;
   capa = lettera = nota = 0;

   while ( c = *buffer++ )   // Walks buffer until NULL
   {
      switch ( c )
      {
         case 'A':
            capa++;
            break;
         case 'a':
            lettera++;
            break;
         default:
            nota++;
      }
   }
   printf_s( "\nUppercase a: %d\nLowercase a: %d\nTotal: %d\n",
      capa, lettera, (capa + lettera + nota) );
}

В предыдущем примере capa увеличивается инкрементно, если c — A в верхнем регистре. Оператор break после capa++ завершает выполнение switch, а элемент правления передается циклу while. Без оператора break объекты lettera и nota также должны быть инкрементированы. Аналогичную цель преследует оператор break для case 'a'. Если c — в нижнем регистре a, lettera увеличивается постепенно, а оператор break завершает тело оператора switch. Если параметр c не является a или A, выполняется оператор default.

Внутренний блок оператора 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

Microsoft C не ограничивает количество значений case в операторе switch. Это число ограничивается только объемом доступной памяти. ANSI C требует, чтобы в операторе switch можно было использовать не менее 257 меток case.

В Microsoft C расширения Microsoft по умолчанию включены. Используйте параметр компилятора /Za для отключения этих расширений.

См. также

Ссылки

Операторы выбора (C++)

Ключевые слова в C++

Использование меток в операторе case