![]() |
![]() |
![]() |
|||||||
![]() |
![]() |
||||||||
![]() |
![]() |
||||||||
![]() |
![]() |
||||||||
![]() |
![]() |
||||||||
![]() |
|||||||||
Хитрый For
А что будет, если поменять
параметр цикла For, и что
случится, если менять
конечное значение
|
|||||||||
|
|||||||||
Практически все учебники по программированию рекомендуют НЕ менять значение переменной-параметра параметрического цикла в теле этого цикла. Связано это с тем, что реализация данного цикла в различных версиях одного и того же языка может варьироваться. (Не объяснять же это нерешительностью программистов или сомнением учителей в умственных способностях учеников!) Избежим этого и рассмотрим, что же случится, если нарушать этот негласный запрет. Изменим параметр,и посмотрим, что будетНапишем элементарную тестовую программку:
Var
For I:= 1 To J Do
Inc(I, 2); Write(I, '; '); 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
For I:= 1 To J Do
Inc(J, 1); Write(I, '; '); End; то есть конечное значение цикла "убегает" от параметра, причем с равной скоростью. Вместо ожидаемого бесконечного цикла на экране получим 1; 2; 3; 4; 5;
Вывод:
конечное значение параметрического цикла
вычисляется только один
раз, перед первым сравнением. Это очень важно
помнить и не ставить в качестве конечного значения
переменные и функции значение которых
меняется в результате выполнения тела цикла:
сравнение все равно будет производится с
начальным значением переменной,
а функция повторно не вызовется.
|
|||||||||
|