TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Хитрый For

А что будет, если поменять параметр цикла For, и что случится, если менять конечное значение

Практически все учебники по программированию рекомендуют НЕ менять значение переменной-параметра параметрического цикла в теле этого цикла. Связано это с тем, что реализация данного цикла в различных версиях одного и того же языка может варьироваться. (Не объяснять же это нерешительностью программистов или сомнением учителей в умственных способностях учеников!) Избежим этого и рассмотрим, что же случится, если нарушать этот негласный запрет.

Изменим параметр,

и посмотрим, что будет

Напишем элементарную тестовую программку:

Var I, J: Byte;
Begin
J:= 5;
For I:= 1 To J Do
Begin
Inc(I, 2);
Write(I, '; ');
End;
Writeln;
End.

Если вы думаете, что на экране появится 3 6 и все, то вы должно быть хорошо представляете, как должен работать данный цикл, но поленились набрать текст.

На самом деле на экране появится последовательность

3; 6; 9; 12; 15; 18; 21; 24; 27; 30; 33; 36; 39; 42; 45; 48; 51; 54; 57; 60; 63; 66; 69; 72; 75; 78; 81; 84; 87; 90; 93; 96; 99; 102; 105; 108; 111; 114; 117; 120; 123; 126; 129; 132; 135; 138; 141; 144; 147; 150; 153; 156; 159; 162; 165; 168; 171; 174; 177; 180; 183; 186; 189; 192; 195; 198; 201; 204; 207; 210; 213; 216; 219; 222; 225; 228; 231; 234; 237; 240; 243; 246; 249; 252; 255; 2; 5;

естественно, выровненная по границам экрана. Появление двойки после значения 255 естественно - произошло переполнение разрядной сетки байтовой переменной I. Интересным является другое: цикл не завершился сразу после того, как параметр превысил конечное значение, но завершился тогда, когда к концу выполнения тела цикла параметр оказался равным конечному значению.

Вывод: при изменинии параметра цикла в его теле необходимо следить за тем, чтобы когда -нибудь этот параметр стал равным конечному значению, а не просто превысил его.

Изменим КЗ,

или продолжим эксперимент

Протестируем еще одну программку (практически полную копию первой за исключением двух символов):

Var I, J: Byte;
Begin
J:= 5;
For I:= 1 To J Do
Begin
Inc(J, 1);
Write(I, '; ');
End;
Writeln; End.

то есть конечное значение цикла "убегает" от параметра, причем с равной скоростью. Вместо ожидаемого бесконечного цикла на экране получим

1; 2; 3; 4; 5;

Вывод: конечное значение параметрического цикла вычисляется только один раз, перед первым сравнением. Это очень важно помнить и не ставить в качестве конечного значения переменные и функции значение которых меняется в результате выполнения тела цикла: сравнение все равно будет производится с начальным значением переменной, а функция повторно не вызовется.

 

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz