Оператор 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 или другой идентификатор с изменяемым типом имеет метку 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) |
Ключевые слова
Пример
#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