Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 87
Текст из файла (страница 87)
Оператор вхдк с условием м]зеп приводит к завершению цикла, в котором он появился, только если выполняется указанное условие. Например, приведенный выше цикл можно переписать так: 1оор ехдс нЪеп Я0М >= 100001 епс$1оорг 32о Глава 7.
Структуры управления иа уровне операторов Любой цикл можно обозначить меткой, и если метка цикла включена в оператор ахзс. то управление передается оператору, находящемуся непосредственно после ука.—.ной метки. Рассмотрим следующий сегмент кода: :СТЕК 1ООР: Еок ЕОХ 1п 1 .. ИАХ ЕОХЯ 1оор :ХМЕЛ 1ООР: Рок СОЕ Еп 1 ..
МАХ СОЬЯ 1оор ЯБМ := ЯОИ + МАТ(((ОХ, СО1); ехдс ОСТЕ(( 1ООР нцеп ЯОМ > 1000.0; епс( 1оор ТХХЕй ЕООР) впс( 1оор ООТЕй 1ООРз 'том примере оператор ем1Ф представляет собой оператор условного перехода на :гвый оператор после внешнего цикла.
Возможен вариант, когда оператор вждк ис.-.ьзуется вместо выражения: еждс нЬеп ЯОИ > 1000.0) том случае его можно рассматривать как оператор условного перехода на первый -.Ратор после внутреннего цикла. Заметим, что операторы ехдк часто используются .. обработки необычных или ошибочных условий. Языки С, С++ и Моди!а-2 имеют безусловные операторы выхода, не содержащие ме~Ькеа)< в языках С и С++ и оператор ЕХТТ в языке Мот(ц!а-2); в языках - . ВТЭКАМ 90 и )ача, как и в языке Ада. есть операторы безусловного выхода с метками тератор ЕХТТ в языке ГОйТКАИ 90 и оператор Ьквв)с в языке )ача), однако в языке .
з целью перехода может быть любой внешний составной оператор. Языки С и С++ имеют механизм управления сопкдпие, передающий управление .жайшему внешнему циклу. Этот оператор не является оператором выхода из цикла. - позволяет пропустить оставшиеся операторы цикла при текущей итерации без прегзщення выполнения цикла. Например, рассмотрим следующий фрагмент кода; н)з11е (ацат < 1000) ( 9еспект(ча1це); ЕЕ (ча1це < О) сопсдпие) ацтп += ча1це; -онцательное значение приведет к пропуску оператора присваивания и передаче управ-:.лия в начало цикла. С другой стороны, в следующем фрагменте отрицательное значе- е приведет к завершению цикла: иЬ11в (вцт < 1000) ( 9егпехт (ча1це) т ЕЕ (ча1це < О) Ькеа'и) зим += ча1це; В языках РОСТКАМ 90 и )ача есть операторы, подобные оператору сопайпие, но, томе того, они могут содержать метки, указывающие, какой именно цикл должен быть гозолжен.
329 7.4. Операторы цикла Операторы ехсг и Ькее)с обеспечивают наличие нескольких выходов из циклов, что иногда мешает читабельности программ. Однако необычные условия, которые приводят к необходимости завершить выполнение цикла, встречаются так часто, что существование таких конструкций вполне оправданно. Более того, читабельность от этого серьезно не страдает, поскольку целью всех таких выходов является первый оператор после цикла, а не просто оператор, расположенный где-то в программе. Оператор Ькее)с языка абака является исключением из этого правила, поскольку его целью может быть любой внешний составной оператор.
У.4.4. Циклы, основанные на структурах данных Нам осталось рассмотреть только один дополнительный вид циклических струюур— циклы, зависящие от структур данных. Эти циклы управляются количеством элементов в структуре данных, а не счетчиком или булевским выражением. Такие операторы есть в языках СОММО)ч Ы5Р и Рег). В языке СОММО)ч Ы5Р функция с)о11яг выполняет повторяющиеся операции над простыми списками, представляющими собой наиболее распространенную структуру данных в программах на языке ЫБР. Вследствие этого ограничения функция с)о11вг является автоматической, т.е. она всегда неявно выполняет повторяющиеся операции над элементами списка.
Эта функция вызывает выполнение ее тела один раз лля каждого элемента списка. Оператор 1огеасй языка Рег! аналогичен функции йо11вг в языке СОММО)ч ).)5Р; он выполняет повторяющиеся операции над элементами списков или массивов. Например, епажев = ("ВоЬ", "Саго1", "Тес)", "Вее1хеЬцЬ")г хокеесЬ Дпаве [впажея) ( рг1пг 3пажег Более общий оператор цикла, основанный на структурах данных, использует структуры данных и функцию, определенные пользователем, для выполнения операций над каждым элементом структуры. Такая функция называется итератором ()гегагог).
Итератор вызывается в начале каждого повторения, и каждый раз при вызове он возвращает некоторый элемент из конкретной структуры данных в некотором определенном порядке. Прелположим, что программа работает с бинарным деревом, и данные в каждом узле должны быть обработаны в некотором конкретном порядке. Оператор цикла, определенный пользователем лля дерева, мог бы успешно устанавливать переменную цикла в узлах дерева по одной при каждом повторении.
При первом выполнении оператора цикла, определенного пользователем, следует выполнить специальный вызов итератора, чтобы получить первый элемент дерева. Итератор должен всегда помнить, какой элемент был обработан последним, чтобы обойти все узлы только по одному разу. Таким образом, итератор должен помнить предысторию. Оператор цикла, определенный пользователем, завершается, когда итератор больше не может найти ни одного элемента. Конструкцию х'ог языков С, С++ и 1ача в силу ее высокой гибкости можно использовать для имитации оператора цикла, определенного пользователем.
Предположим, что программа должна обработать узлы бинарного дерева. Если корень дерева обозначен переменной гоог, и функция ггачегзе устанавливает свои параметры так, чтобы они ЗЗО Гдово 7. Структуры управления но уровне операторов . ыывали на следующий элемент дерева в требуемом порядке, можно использовать сле- ": ащий оператор: гог (рсг = гоог( рсг == пц11) сгачегве(рсг) ) ( Э этом операторе функция г гачегее представляет собой итератор. Оператор цикла, определенный пользователем, играет более важную роль в объектно:гиентпрованном программировании, чем в ранних парадигмах программирования. При-; на этого заключается в том, что пользователи в настоящее время обычно конструируют зхтрактные типы данных для структур данных.
В таких случаях оператор цикла, опреде-енный пользователем, и его итератор должны быть созданы автором абстракции данных, -.:скольку представление объектов данного типа пользователю не известно. В языке С+~ «..ераторы для типов, определенных пользователем, или классов часто реализуются либо -врез дружественные функции класса, либо как отдельные классы итераторов. 7.5.
Беэусловный переход Оператор безусловного перехода передает управление выполнением в указанное ° есто программы. 7.$.1. Проблемы безусловного перехода Наиболее жаркие дебаты, связанные с разработкой языков программирования. в коне (960-х годов шли вокруг вопроса, должен ли безусловный переход быть неотьемле:й частью любого языка программирования высокого уровня, и если да, то следует ли ::.раничивать его использование. Безусловный переход. или оператор до(о, является самым мощным оператором -равлення потоком выполнения программы.
Однако неосторожное использование поэбных операторов может создать проблемы. Оператор яо(о обладает ошеломляющей эщью и большой гибкостью (все другие управляющие структуры можно построить с — чошью оператора яо(о и оператора ветвления), но эта сила делает его использование : засным. Если применять его без ограничений, наложенных либо языком, либо стандар-зми программирования, оператор яо(о может сделать программу действительно нечита.. ельной и, как результат. в высшей степени ненадежной и трудной для эксплуатации.
Эти проблемы непосредственно вытекают из способности оператора кого вынужлать выполнение любого оператора в программе вслед за любым другим оператором, образуя -эследовательность выполнения программы, независимо от того, предшествует ли этот : тератор первому оператору или следует за ним в тексте программы. Читабельность явтяется наилучшей, когда порядок выполнения операторов почти совпадает с порядком, в -втором они приводятся в программе — в нашем случае это может означать порядок зыполнения "сверху-вниз", к которому мы привыкли. Ограничение операторов яо(о та. им образом, чтобы они могли передавать управление в программе только вниз, частич.о решает проблему.
Подобные ограничения позволяют операторам яо(о передавать , правление в некоторые разделы программы в ответ на ошибки или необычные условия, чо не позволяет использовать их для построения циклов любого вида. 331 7.5. Безусловный первход Несмотря на то что некоторые думающие люди еше раньше предлагали ограничить использование операторов 8о1о, именно Эдсгер Дийкстра дал компьютерному сообществу первое получившее широкое распространение разъяснение опасности операторов безусловного перехода.
В своем письме он писал: "Оператор 8о1о сам по себе слишком примитивен; он слишком похож на предложение запутать программу' (О!)кз!га, 1968а). На протяжении первых нескольких лет после публикации точки зрения Дийкстры на оператор його большое количество людей публично выступали за то, чтобы либо прямо запретить.
либо по крайней мере ограничить использование операторов його. Среди тех, кто не поддерживал предложение о полном исключении оператора його. был Доналд Кнут (Попа!6 Кпцгп), объяснявший, что бывают случаи, когда эффективность оператора 8о1о перевешивает его вред для читабельности (Кпцзп, 1974). Было разработано несколько языков программирования, не содержавших оператора його, — например, языки Моди!а-2 н Зача. Однако самые современные популярные языки программирования включают операторы 8ого.