Оператор switch
(C)
Операторы switch
и case
помогают управлять сложными условными операциями и операциями ветвления. Оператор switch
передает управление в оператор внутри своего тела.
Синтаксис
selection-statement
:
switch (
expression
)
statement
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
Замечания
Оператор switch
передает управление одному из labeled-statement
в своем теле в зависимости от значения expression
.
Значения expression
и значение каждого constant-expression
должны иметь целочисленный тип. Выражение constant-expression
должно иметь однозначное константное целочисленное значение во время компиляции.
Управление передается оператору case
, значение constant-expression
которого соответствует значению выражения expression
. Оператор switch
может содержать неограниченное число экземпляров case
. Однако значения ни одной из пар выражений constant-expression
в одном операторе switch
не должны совпадать. Выполнение тела оператора switch
начинается с первого соответствующего оператора labeled-statement
или после него. Выполнение продолжается до конца тела оператора или пока оператор break
не передаст управление за пределы тела.
Оператор switch
обычно используется следующим образом:
switch ( expression )
{
// declarations
// . . .
case constant_expression:
// statements executed if the expression equals the
// value of this constant_expression
break;
default:
// statements executed if expression does not equal
// any case constant_expression
}
Оператор break
можно использовать для завершения обработки определенного оператора с меткой в операторе switch
. Он выполняет ветвление до конца оператора switch
. Без оператора break
выполнение программы продолжается до следующего оператора с меткой. Операторы будут выполняться до достижения оператора break
или конца всего оператора. В некоторых случаях может требоваться именно такое поведение.
Оператор default
выполняется, если ни одно из значений case
constant-expression
не равно значению expression
. Если оператор default
не указан и соответствующий вариант case
не найден, ни один из операторов в теле оператора switch
не выполняется. Допускается не более одного оператора default
. Оператор default
не обязательно должен находиться в конце. Он может располагаться в любом месте тела оператора switch
. Метка case
или default
может располагаться только внутри оператора switch
.
Выражения switch
expression
и case
constant-expression
должны быть целочисленного типа. Значение каждого case
constant-expression
в теле оператора должно быть уникальным.
Метки case
и default
тела оператора switch
имеют значения только при начальной проверке, которая определяет, с какого места тела оператора начинается выполнение. Операторы switch
могут быть вложенными. Любые статические переменные инициализируются до выполнения любых операторов switch
.
Примечание.
Объявления могут располагаться в начале составного оператора, образующего тело оператора switch
, но инициализации, включенные в объявления, не выполняются. Оператор switch
передает управление непосредственно в выполняемый оператор в теле, минуя все строки, содержащие инициализации.
В следующих примерах кода показаны операторы switch
:
switch( c )
{
case 'A':
capital_a++;
case 'a':
letter_a++;
default :
total++;
}
В этом примере, если переменная c
равна 'A'
, выполняются все три оператора тела switch
, так как оператор break
перед следующим оператором case
отсутствует. Управления передается первому оператору (capital_a++;
) и продолжается по-порядку во всей остальной части тела. Если переменная c
равна 'a'
, увеличиваются значения переменных letter_a
и total
. Если переменная c
не равна 'A'
или 'a'
, увеличивается только значение переменной total
.
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
В этом примере оператор break
указан после каждого оператора тела switch
. Оператор break
вызывает принудительный выход из тела оператора после выполнения одного оператора. Если переменная i
равна –1, увеличивается только значение переменной n
. Оператор break
после оператора n++;
передает управление за пределы тела оператора, минуя оставшиеся операторы. Аналогично, если переменная i
равна 0, увеличивается только значение переменной z
; если переменная i
равна 1, увеличивается только значение переменной p
. Заключительный оператор break
, строго говоря, не требуется, так как управление передается из тела в конце составного оператора. Он добавлен для единообразия.
Один оператор может содержать несколько меток case
, как показано в следующем примере:
switch( c )
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : convert_hex(c);
}
В этом примере, если constant-expression
значение равно любому букву между 'a'
и 'f'
, convert_hex
вызывается функция.
Только для систем Майкрософт
Microsoft C не ограничивает количество значений case
в операторе switch
. Это число ограничивается только объемом доступной памяти. ANSI C требует, чтобы в операторе switch
можно было использовать не менее 257 меток case
.
В Microsoft C расширения Майкрософт по умолчанию (default) включены. Используйте параметр компилятора /Za для отключения этих расширений.