Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 85
Текст из файла (страница 85)
Параметры цикла могут быть выражениями и иметь положительные или отрицательные значения. Они вычисляются в начале выполнения оператора 00 н их значения используются для вычисления количества повторений цикла (йегапоп соцп!). Цикл управляется именно количеством повторений цикла, а не параметрами цикла, так что лаже если параметры цикла бчдут изменены внутри цикла. что допускается.
эти изменения не смогут повлиять на управление циклом. Количество повторений цикла хранится во внутренней переменной, которая недоступна пользовательской программе. В конструкцию 00 можно войти только через оператор 00, что делает этот оператор структурой с одним входом. Когда выполнение оператора 00 завершается (независимо от того, каким именно образом это происходит), счетчик цикла имеет то значение, которое было присвоено ему в последний раз. Таким образом, полезность счетчика цикла не зависит от того, как именно завершается цикл. Описание операционной семантики оператора 00 языка гОКТКАХ 77 приведено ниже: Тп1Г ча1це := Тпдт ехргеввдоп гегмзпа1 ча1це:= гегм1па1 ехргевв1оп втер ча1це:= втер ехргеввдоп г)о чаг:- Тп1г ча1це Тгегаг1оп соипг жах[зпс[[теттдпа1 ча1це-1п1Г ча1це + втер ча1це) I Егер ча1це), О) 1оор: 1г' Тгегагдоп соцпг < 0 дого оцг [1оор Ьог)у] с)о чаг:= г)о чаг + вТер ча1це Егегагдоп соцпг:= 1гегагдоп соцпг — 1 доко 1оор оцг: Язык гОйТйАХ 90 содержит оператор 00 языка гО)(ТКАМ 77 и добавляет новую форму; [имя:] 00 переменная = начальное значение, конечное значение величина шага) ЕЫ0 00 [имя) В этом операторе 00 счетчик цикла может иметь только тип 1МТЕСЕЕ (как и его предшественник в языке ГО[(Т)(АХ 77).
Другое изменение состоит в том, что этот оператор использует специальное замыкающее ключевое слово (или фразу) Е))0 00, вместо оператора с меткой. 320 Глава 7. Структуры управления иа уровне опвротороа УА. 1.3. Оператор Фот в языке АвООЕ 60 Оператор ког языка А].ОО[. 60 описан здесь лля того, чтобы показать, как погоня за -лбкостью может привести к чрезмерной сложности. Оператор Дог языка АЮО[.
60 — гезставляет собой значительное обобщение оператора 00 языка РОСТКА]Ч, как пока:зно в его описании с помощью РБНФ (расширенной формы Бэкуса-Наура): <=сг всмс> -ь гог чаг:= <115С е1етепс> (, <11вс е1емепг>] с]о <вгагемепс> < 15Г е1егаепс> -э <ехрге551оп> <ехргевв1оп> веер <ехргев51оп> цпв11 <ехргевв1оп> <ехрге551оп> нМ1е <Воо1еап ехрг> Значительное различие между этим и большинством других операторов со счетчиком заключается в том, что эта конструкция может комбинировать счетчик и булевское выгзжение в механизме управления циклом.
Три простейшие формы этого оператора иллюстрируются следующими примерами: г'ог соцпг:= 1, 2, 3, 4, 5, 6, 7, 8, 10 с[о 115Г [соцпг):= 0 Гог соцпг := 1, веер 1 цпк11 10 с]о 115Г[соцпг] бог соцпс := 1, соцпг + 1 нЬ11е (ссцпг <= 10] с]о 115Г [соипг]:= 0 Этот оператор становится намного сложнее, когда его различные простые формы . чбинируются друг с другом, как показано ниже; ког 1пс[ех:= 1, 4, 13, 41 веер 2 цпк11 47, 3 * 1пг]ех нЫ1е 1пг]ех < 1000, 34, 2, -24 ао вим:= вцп + 1пг[ех Эти операторы добавляют к переменной вцп следующие значения: 4, 13, 41, 43, 45, 47, 147, 441, 34, 2, -24 ] онечно.
возможна ситуация, в которой улобно использовать подобные сложные операторы, однако такие случаи слишком редки, чтобы служить оправданием усложнения языка. Оператор йог языка А[.ОО[. 60 более труден для понимания, чем кажется на первый взгляд, поскольку все выражения в операторе гог вычисляются при каждом выполнении цикла. Таким образом, если выражение веер содержит ссылку, например, на переменную соцпс, а операторы цикла изменяют эту переменную, то величина шага будет изменяться на каждой итерации. Например, рассмотрим цикл 1; хог ссцпс:= 1 веер соцпг ип611 3 * 1 с[о + 1 321 7.4.
Операторы цикла Оператор Еог заставляет присваивание (1: = 1 + 1) выполняться повторно, в то время как переменная соцпг удваивается при каждом повторении (поскольку шаг всегда равен прелыдушему значению переменной соыпг). Переменная соцпг увеличивается быстрее, чем значение выражения цпц11 (3 * 1), и цикл не будет бесконечным, хотя на первый взгляд это не очевидно. Значения переменных и управляющих выражений в этом цикле приведены ниже: ипсй1 3 6 9 12 15 — завершает цикл соцпг 1 2 4 8 16 веер 1 2 4 8 16 аког тат := 1ждг ехрг 1оор: ипзг1 := цпг11 ехрг втер :- эсер ехрг Гежр := (аког таг — цпс11) * 810М(эсер) дг (Гежр > 0 йоко оцг (1оор Ьос(у] аког таг := бог тат + втер досо 1оор оцг: Ниже приводится описание операционной семантики более сложного примера оператора Еог: гог сорос:= 10 эсер 2 * соцпс цпШ1 1пдг * 1п(Г, 3 * соцпГ и)зд1е вцв <= 1000 ~йо вцж : вцж + соцпг соцпг := 10 1оор1: аг' соцпс > 1п1Т * 1пйг доцо 1оор2 вцж:= вцж + соцпг соцпг: соцпг+(2*соцпг) аосо 1оор1 1оор2: соцпс:=3*соипс зг вша>1000 досо оиг Глава 7.
Структуры управления на уровне операторов 322 Проектное решение, касающееся оператора гог языка А(.ОО). 69, было следующим: счетчик цикла может быть либо целым, либо вещественным числом и объявляется подобно всем другим переменным, так что ею область видимости определяется его объявлением. Как и в языке гОйТКАХ 77, счетчик после завершения цикла имеет то значение, которое было присвоено ему при последнем повторении независимо от того, что именно вызвало завершение цикла.
Параметры цикла, но не счетчик, могут изменяться в его теле. Переход в тело цикла извне не разрешается, а его параметры вычисляются при каждом повторении. Нелегко охарактеризовать операционную семантику полного оператора бог языка А(.ОО(, 60 со всеми ею возможностями. Вместо этого, мы сначала дадим описание общего оператора аког только в форме евер-ипШ:. азу:=вша + соцпг досо 1оор2 7.4. 14. Оператор 1от в языке Разса1 Оператор Гок языка Рааса( представляет собой образец простоты. Он имеет следую~й вил: Еок переменная:=начальное значение (со(йоитгсо) конечное значение бо оператор Выбор (со(бонззсо) позволяет значению счетчика цикла увеличиваться или уменьзться с шагом 1.
Проектное решение, касаюшееся оператора Гок языка Рааса!, состоит з;ледуюшем: счетчик никла должен иметь перечислимый тип, а его область видимости -резеляется его объявлением. При нормальном завершении цикла значение счетчика .-зновнтся неопределенным. Если выполнение никла прекратилось преждевременно, то ;-етчик цикла имеет последнее присвоенное ему значение. Счетчик цикла не может изеняться внутри тела цикла.
Начальное и конечное значения определяются выражениями . бого типа, совместимого с типом счетчика, и могут изменяться внутри тела никла, но, — эскольку они вычисляются только один раз, это не влияет на управление циклом. 7.4. 1.5. Оператор $от в языке Ас1а Оператор кок языка Аба похож на свой аналог в языке Рааса!.
Он представляет собой ,.кл с предварительной проверкой условия и имеет следующий вил: Гок переменная дп (кечекве! дискретный диапазон 1оор епб 1оор; дискретный диапазон — это ограниченный подтип целого или перечислимого типа, -'пример, 1 .. 10. Наиболее интересное новое свойство оператора йот языка Аба относится к области з:димости счетчика, которая ограничивается телом цикла. Счетчик неявно объявляется в -зчале оператора кок и неявно выходит из области видимости после завершения цикла. -зссмотрим, например, следуюшнй фрагмент кода: :ОВЕЕТ : ГЬОАТ := 1.35; Гок СООМТ дп 1..10 1оор 5ОМ := 5ОМ + СООМТг епб 1оор; )зесь переменная СООИТ типа ГЬОАТ не затрагивается оператором бок.
После заверше-.на цикла переменная СООИТ сохраняет тип ГЬОАТ и значение 1. 35. Кроме того, переменная СОПИТ типа ГЬОАТ скрывается от кода, находяшегося в теле цикла, маскируясь :четчиком цикла СООИТ, который неявно объявляется как переменная, имеюшая тип :::. ЕОЕА и принимаюшая значения из дискретного диапазона. Переменной цикла в языке Аба нельзя присваивать никакого значения внутри тела пкла. Переменные, используемые для указания дискретного диапазона, могут изменять:я внутри цикла, но, поскольку диапазон вычисляется только один раз, эти изменения не влияют на управление циклом. В языке Аба переходы внутрь тела цикла йок не разрешаются.
Ниже приводится описание операционной семантики цикла кок языка Аба: 323 7.4. Операторы цикла (с(е11пе Еог чаг (переменная, имеющая дискретный диапазон значений)) (еча1цасе с(1всгеге галсе] 1оор: Ей[нет ни одного элемента, выходящего за пределы дискретного диапазона) сосо оцг аког чаг:=[следующий элемент из дискретного диапазона] [тело цикла] оого 1оор оиг: [неопределенное значение переменной Гог чаг) 7.4.
36. Оператор Ьг ° языках С, С++ и 3ача Оператор гог языка С имеет следуюший общий вид: аког (выражение 1) выражение 2; выражение Э] тело цикла Тело цикла может состоять нз отдельного оператора, составного оператора или быть пустым. Поскольку операторы в языке С вычисляют результаты и, следовательно, могут рассматриваться как выражения, в операторе Гог выражения часто являются операторами. Первое выражение предназначено для инициализации и вычисляется только один раз в начале выполнения оператора гог. Второе выражение является управлением цикла и вычисляется перед каждым выполнением тела цикла.
Как зто принято в языке С, нулевое значение означает "ложь", а все ненулевые значения означают "истину". Следовательно, если значение второго выражения равно нулю, то выполнение оператора гог прекрашается; в противном случае операторы цикла продолжают выполняться. Последнее выражение в операторе гог вычисляется после каждого выполнения тела цикла.