Некоторые примеры из семинарских занятий по Си (А.А. Вылиток - Лекции), страница 4
Описание файла
Файл "Некоторые примеры из семинарских занятий по Си" внутри архива находится в папке "А.А. Вылиток - Лекции". PDF-файл из архива "А.А. Вылиток - Лекции", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 4 страницы из PDF
Если значение управляющего выражения совпадает со значением константноговыражения одной из меток 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 */…}.