Для выполнения многочисленных проверок в программах можно использовать конструкцию if-else-if, но она очень трудна для восприятия и в нем легко запутаться. С этой целью в языке С есть оператор принятия решений switch , выполняющий действия, основываясь на сравнении значения со списком констант символов или целых чисел. При обнаружении совпадения выполняется оператор или операторы, ассоциированные с данным значением. Оператор switch имеет следующий вид:
switch (выражение) {
case константа1 :
последовательность операторов
break;
case константа2 :
последовательность операторов
break;
. . .
case константаN :
последовательность операторов
default :
последовательность операторов
}
Оператор default выполняется, если не найдено соответствий. default не обязателен и, его нет, то в случае отсутствия совпадений ничего не происходит. Когда обнаруживается совпадение, операторы, ассоциированные с соответствующим case, выполняются до тех пор, пока не встретится оператор break . В случае default (или последнего case, если отсутствует default), оператор switch заканчивает работу при обнаружении конца.
Следует знать о трех важных моментах оператора switch:
1. Оператор switch отличается от оператора if тем, что он может выполнять только операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения.
2. Не может быть двух констант в одном операторе switch, имеющих одинаковое значение. Конечно, оператор switch, включающий в себя другой оператор switch, может содержать аналогичные константы.
3. Если в операторе switch используются символьные константы, они автоматически преобразуются к целочисленным значениям.
Пример.
char sign;
int x, y, z;
switch (sign) {
case ‘-‘ : z = x-y;
break;
case ‘+’ : z = x+y;
break;
case ‘*’ : z = x*y;
break;
case ‘/’ : z = x/y;
case ‘%’ : z = x%y;
break;
default : printf(“Неизвестная операция\n”);
}
С технической точки зрения операторы break являются необязательными в операторе switch. Они используются для окончания работы последовательности операторов, ассоциированных с данной константой. Если оператор break отсутствует, продолжают выполняться операторы следующего раздела case, пока не будет достигнут оператор break или конец оператора switch. О константах выбора можно думать как о метках. Выполнение начинается с метки, соответствующей искомому значению и будет продолжаться, пока не будет достигнут break или конец оператора switch. Можно использовать пустые условия. Перепишем предыдущий пример в виде:
Пример.
char sign;
int x, y, z;
switch (sign) {
case ‘%’ :
case ‘-‘ : z = x-y;
case ‘+’ : z = x+y;
case ‘*’ : z = x*y;
case ‘/’ : z = x/y;
default : printf(“Неизвестная операция\n”);
}
При работе с этим фрагментом будет происходить следующее:
1) при вводе символа sign = ‘%’ , будут выполняться операторы: z = x-y; z = x+y; z = x*y; z=x/y и выводится сообщение “Неизвестная операция”;
2) при вводе символа sign = ‘+’ будут выполняться операторы: z = x+y; z = x*y; z = x/y и выводится сообщение “Неизвестная операция”;
3) при вводе символа sign =’*’ будут выполняться операторы: z = x*y; z = x/y и выводится сообщение “Неизвестная операция” и т. д.
В блоке кода оператора switch можно делать объявления переменных как сразу после ключевого слова switch, так и после слова case. Например:
switch (c) {
int t;
case 1:
. . .
}
или
switch (c) {
case 1:
int t;
. . .
}
6.3 Вложенные операторы switch
Оператор switch может иметь среди последовательности операторов другой оператор switch. Даже если константы case внутреннего и внешнего операторов имеют одинаковые значения, не возникнет никакого конфликта. Например: