Некоторые примеры из семинарских занятий по Си (1114741), страница 4
Текст из файла (страница 4)
Если значение управляющего выражения совпадает со значением константноговыражения одной из меток case, принадлежащих оператору switch, управлениепередается оператору, помеченному этой меткой, как это делается при выполненииоператора goto.3. Если значение управляющего выражения не совпадает со значением константноговыражение ни одной из меток case, но в операторе switch есть оператор,помеченный меткой default, управление передается этому оператору.4. Если значение управляющего выражения не совпадает со значением константноговыражение ни одной из меток case и в операторе switch нет метки default,ни один из операторов тела switch не выполняется, а управление передаетсяоператору, следующему непосредственно за оператором switch.Если при сравнении значений управляющего выражения и константного выраженияметки case их типы не совпадают, происходит преобразование типа значения меткив тип управляющего выражения.
Для прекращения выполнения оператора switch влюбой точке его тела следует воспользоваться оператором break. Сравнитеследующие два примера.switch(x) {case 1: printf(”*”);case 2: printf(”**”);case 3: printf(”***”);}При x равном 2 будет напечатано пять звездочек.switch(x) {case 1: printf(”*”); break;case 2: printf(”**”); breakcase 3: printf(”***”); break;}При x равном 2 будет напечатано две звездочки.В последнем операторе break из последнего примера нет необходимости, однако онможет предотвратить ошибку при добавлении в эту конструкцию новых операторов.В заключение приведем замысловатый, но эффективный и лаконичный фрагмент длярешения следующей задачи.
Пусть имеется функция prime(n), которая определяет,простое ли число n. Если число простое, его надо передать попдпрограмме prog_1,иначе – попдпрограмме prog_2. Известно, что для данного фрагмента малые числа– из первого десятка – будут встречаться значительно чаще, чем остальные.switch(n)default:if (prime(n))case 2: case 3: case 5 : case 7: prog_1(n);elsecase 4: case 6: case 8: case 9: case 10: prog_2(n);Как видим, тело оператора switch не обязано быть составным оператором: {…}.Здесь мы имеем один условный оператор, помеченный меткойdefault.Особенностью языка Си, в отличие от Паскаля, является возможность перехода пометке внутрь сложных операторов (условных, циклов, составных).
Для чисел от 2 до10 в данном фрагменте происходит прямая передача управления на оператор,помеченный соответствующей case-меткой, для остальных попадаем на меткуdefault и вычиселние начинается с проверки условия в операторе if.Отметим, однако, что переход внутрь сложных операторов на case-метки в оператореswitch, или аналогичный переход на обычные метки с помощью goto, существеннозатрудняютпониманиепрограммы,нарушаяконцепциюструктурногопрограммирования. Кроме того, не выполняется начальная инициализация дляобъектов, находящихся в начале блока, внутрь которого произошел переход, хотяпамять под эти объекты все же отводится, например:goto m;…{ int i=23; /* инициализация */…m: /* i не инциализирована, если попали сюда по goto */…}.