Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 115

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 109 110 111 112 113 114 < 115 > 116 117 118 119 120 121 .. 316 >> Следующая

then begin { будут сдвиг и завершение цикла } incl := True; if L < N then
{ А не заполнен, нужен сдвиг вправо: } begin for j := L downto i+1 do A[j+1] := A[j];
A[i] := X; L := L+1 end else
{ А заполнен, нужен сдвиг влево: } begin for j := 1 to i-1 do A[j] := A[j+1]; A[i] := X
end
end
else if A[i] = X
then incl := True
{нали элемент, равный X, цикл заверается}
else A[i] > X
begin i := i + 1; incl := i = 0
end
326
ГЛАВА 7. ЦИКЛИЧЕСКИЕ ВЫЧИСЛЕНИЯ
until incl {условие ц end;
for i := 1 to L do write (A[i])
условие{
{только при i <> 0 и} {A[i] > X цикл продолжается } цикла поиска места вставки X }
end
end.
Конец примера 7.2.5.
7.2.4. Потоки и цикл for
Цикл for синтаксически объединяет инициализацию, проверку окончания цикла и генераци нового элемента. адим его конкретно-синтаксическу структуру для языка C:
"for" "(" инициализирующий оператор> <выражение-условие> ";" выражение пересчета> ")"<оператор>
Такая структура оператора цикла исторически сложилась для достижения сразу трех целей:
1. наглядности;
2. оптимизации: упроения распознавания случаев, которые допуска т ускоренное выполнение программ ;
3. обогаения возмо ностей программирования: например, за счет воз-мо ности опускать части оператора for цикл while становится изб -точным в C/C++.
птимизационное назначение цикла for — это традиция, восходяая к Algol 60 и даже к языку FORTRAN. В цикле for большинства языков программирования, в частности в ряде случаев его употребления в С, можно явно выделять так называемые параметры цикла — переменные, принимающие те значения, при которых должны быть пройдены итерации. Переменные цикла долны рассматриваться и использоваться как связанне переменные данного оператора, то есть (так е, как в логике) как такие переменные, которм не могут бть приданы конкретне значения извне, которе обязаны пробе-
ать все мно ество, определенное в цикле, в том порядке (а это — отличие от логики), как предписывает цикл.
7.2.
327
Например, во фрагменте
for ( i = 0; i < 100; i++ ). . .
оператор, обозначенный многоточием, выполняется при i, равном 0,1,..., 99. i — это параметр данного цикла. В других языках параметр цикла —понятие, выделенное синтаксически. Например, в языке Pascal
for i:=0 to 99 do S
переменная i внутри S имеет статус параметра цикла. В частности, явное присваивание ей нового значения сигнализируется транслятором как серьезное предупреждение. В языке Алгол-68 цикл имеет еще более изощренную форму:
for i from 0 to 99 while P<i> do S<i> od Соответственно, здесь конец цикла отмечен скобкой, парной к его началу, параметр цикла выделен явно и, более того, чтобы окончательно исключить недоразумения, объявляется константой, которая описана данным оператором и имеет областью действия лишь условие P и оператор S. Так что все вопрос , связанне с присваиванием параметру цикла, отпада т сами собой. Естественно, что при следующей итерации значение параметра цикла будет новым, а после выхода из цикла любым способом параметр просто перестает суествовать, и вопрос о его последнем значении так е сам собой отпадает. Решение, принятое в языке Ada, синтаксически ближе к решению Алгола-68, а семантически — к принятому в языке Pascal.
Если переменная i будет размеена на быстром регистре, то цикл будет выполняться быстрее по сравнению со случаем размещения этой переменной в основной памяти. Возмо но, что цикл допускает другой порядок перебора итераций с эквивалентными результатами счета, а для вычислительной маин этот другой порядок ока ется более эффективнм. Вясня тся подобные свойства при анализе оператора цикла, учет их весьма елателен для качества объектного кода, и поэтому преобразование цикла (в качестве неявной процедуры) вставляется в оптимизаци , производиму промы -ленными трансляторами.9
Чтоб позволить транслятору осуествлять оптимизируие преобра-
9 Эта услуга порою превращается в медвежью, поскольку автор программы может даже не подозревать, что итерации цикла идут, по решению "сверхкомпетентного" транслятора, в другом порядке. Тем более бывает шокирован программист, когда после вставки в цикл вроде бы ничего не меняющего оператора программа перестает работать в том месте, где она уже была полностью отлажена, а затем, после череды панических хаотических изменений, внезапно вновь начинает работать как надо. А последствия паники и хаоса будут расхлебы-ваться еще долго. . .
328
7.
зования, в описания некоторых языков (Алгол, Pascal и др.) включают довольно странное, на первый взгляд, указание: значение параметра цикла for не определено после естественного завершения, т. е. завершения из-за лож -ности условия продолжения (в примере i < 100). Смысл указания становится понятным в контексте приведеннх ве рассу дений: оно разреает разработчикам трансляторов программировать циклы так, как это удобно в конкретной вычислительной среде.
Пример 7.2.6. Оптимизация, цикл for и массивы. Рассмотрим фрагмент программы:
for (int i = 1; i < 100; i++ )
утем анализа текста мо но узнать, что этот цикл мо но реализовать в кодах процессора Intel-80?86 следующим образом (в частности, организовав обратный порядок итераций):
Предыдущая << 1 .. 109 110 111 112 113 114 < 115 > 116 117 118 119 120 121 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100