Namespaces
Variants

switch statement

From cppreference.net

Выполняет код в соответствии со значением целочисленного аргумента.

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

Содержание

Синтаксис

attr-spec-seq (необязательно) switch ( expression ) statement
attr-spec-seq - (C23) необязательный список атрибутов , применяемых к оператору switch
expression - любое выражение целочисленного типа (char, знаковое или беззнаковое целое число, или перечисление)
statement - любой оператор (обычно составной оператор). Метки case: и default: разрешены в statement , а оператор break ; имеет особое значение.
case constant-expression : statement (1) (до C23)
attr-spec-seq (опционально) case constant-expression : statement (опционально) (1) (начиная с C23)
default : statement (2) (до C23)
attr-spec-seq (опционально) default : statement (опционально) (2) (начиная с C23)
constant-expression - любое целочисленное константное выражение
attr-spec-seq - (C23) опциональный список атрибутов , применяемых к метке

Объяснение

Тело оператора switch может содержать произвольное количество case: меток, при условии что все значения constant-expressions являются уникальными (после преобразования к promoted type выражения expression ). Может присутствовать не более одной default: метки (хотя вложенные операторы switch могут использовать свои собственные default: метки или иметь case: метки, чьи константы совпадают с использованными во внешнем операторе switch).

Если expression вычисляется в значение, равное значению одного из constant-expression после преобразования в продвинутый тип expression , тогда управление передается оператору, помеченному этим constant-expression .

Если выражение вычисляется в значение, которое не соответствует ни одной из меток case: , и присутствует метка default: , управление передается оператору, помеченному меткой default: .

Если выражение принимает значение, которое не соответствует ни одной из меток case: и метка default: отсутствует, ни одна часть тела оператора switch не выполняется.

Оператор break , встреченный в любом месте statement , завершает выполнение оператора switch:

switch(1) {
    case 1 : puts("1"); // выводит "1",
    case 2 : puts("2"); // затем выводит "2" ("сквозное выполнение")
}
switch(1) {
    case 1 : puts("1"); // выводит "1"
             break;     // и выходит из switch
    case 2 : puts("2");
             break;
}

Как и все другие операторы выбора и итерации, оператор switch устанавливает блочную область видимости : любой идентификатор, введенный в выражении , выходит из области видимости после оператора .

Если VLA или другой идентификатор с изменяемым типом имеет case: или default: метку в своей области видимости, весь оператор switch должен находиться в его области видимости (другими словами, VLA должен быть объявлен либо до всего оператора switch, либо после последней метки):

switch (expr)
{
        int i = 4; // not a VLA; OK to declare here
        f(i); // never called
//      int a[i]; // error: VLA cannot be declared here
    case 0:
        i = 17;
    default:
        int a[i]; // OK to declare VLA here
        printf("%d\n", i); // prints 17 if expr == 0, prints indeterminate value otherwise
}
(since C99)

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

switch , case , default

Пример

#include <stdio.h>
void func(int x)
{
   printf("func(%d): ", x);
   switch(x)
   {
      case 1: printf("case 1, ");
      case 2: printf("case 2, ");
      case 3: printf("case 3.\n"); break;
      case 4: printf("case 4, ");
      case 5:
      case 6: printf("case 5 or case 6, ");
      default: printf("default.\n");
   }
}
int main(void)
{
   for(int i = 1; i < 9; ++i) func(i);
}

Вывод:

func(1): case 1, case 2, case 3.
func(2): case 2, case 3.
func(3): case 3.
func(4): case 4, case 5 or case 6, default.
func(5): case 5 or case 6, default.
func(6): case 5 or case 6, default.
func(7): default.
func(8): default.

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.8.4.2 Оператор switch (стр: 108-109)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.8.4.2 Оператор switch (стр: 149-150)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.8.4.2 Оператор switch (стр: 134-135)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.6.4.2 Оператор switch

Смотрите также

Документация C++ для switch statement