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

 

Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

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

  
      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 увеличивается инкрементно, если cA в верхнем регистре. Оператор 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 C не ограничивает количество значений case в операторе switch. Это число ограничивается только объемом доступной памяти. ANSI C требует, чтобы в операторе switch можно было использовать не менее 257 меток case.

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

Инструкции выбора
Ключевые слова в C++
(NOTINBUILD) Using Labels in the case Statement

Показ: