switch statement
Выполняет код в соответствии со значением целочисленного аргумента.
Используется там, где одна или несколько из множества ветвей кода должны быть выполнены в соответствии с целочисленным значением.
Содержание |
Синтаксис
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 устанавливает блочную область видимости : любой идентификатор, введенный в выражении , выходит из области видимости после оператора .
Если 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 } |
(since 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
statement
|