Spec-Zone.ru › C

Оператор switch

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

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

Синтаксис

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

Объяснение

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

Если выражение принимает значение, равное значению одного из константных_выражений после преобразования к типу выражения, то управление передаётся оператору, помеченному этим константным_выражением.

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

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

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

switch(1) {
    case 1 : puts("1"); // prints "1",
    case 2 : puts("2"); // then prints "2" ("fall-through")
}
switch(1) {
    case 1 : puts("1"); // prints "1"
             break;     // and exits the switch
    case 2 : puts("2");
             break;
}

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

Если 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
}
(с 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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/switch

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API