Другие языки программирования и технологии

Вопрос про цикл For

Почему переменную цикла i категорически нельзя изменять какими-либо операторами внутри цикла: for i := 1 to 10 do begin . . i := i+1; . . end; Что она сама автоматически меняется - знаю, и что можно выйти за пределы цикла, или зациклиться. Почему еще????Есть еще что-то важное.
Андрей Ужва
Андрей Ужва
1 185
> Есть еще что-то важное

Причем весьма.
Оптимизатор генерируемого исполн. кода в составе компилятора волен распоряжаться размещением и фактическим значением переменной for-цикла так как он считает необходимым.
Попытка пользовательского изменения переменной цикла в теле for-цикла повлечет за собой искажение логики оптимизации, поэтому это запрещено.
На то существуют while и repeat.
Евгений Щербаков
Евгений Щербаков
32 502
Лучший ответ
Андрей Ужва Вы знаете, похоже на правду)))) Проверю на паре)
Специальная защита в некоторых языках программирования. Но легко обойти и самому сделать такой цикл с изменением переменной

i=1
:xxx

....

i=i+1
if i = 11 goto yyy
goto xxx
:yyy
Важно то, что в зависимости от языка, версии компилятора и еще неизвестно чего. Вы не можете с достаточной уверенностю сказать что вам выдаст первый же цикл.
Если i увеличится до вашего выражения "i := i+1; то вы получите i =3, а если после выражения то i=2.
Сергей Ромась
Сергей Ромась
9 979
Сергей Ромась Извините у вас i было равно 1 следовательно бужет либо 4 либо 3 соответственно.
Сергей Проданцов Всё там известно, проверки человек не хочет писать и не понятно с какого перепугу ему изменения в основном счётчике понадобились...по-моему просто студент, и отчёта программе не отдаёт(сужу по тому, как основной задачи нет, значит и понимания нет)
Если счётчик цикла используется только для индексации, то компилятор может помещать её не на стеке, а в регистры процессора, что существенно ускоряет обращение к этой переменной.
можно, используя не for, а к примеру while. можно и For просто задаём парамертр STEP или Undo(как удобнее)
почему же? можно и так делать но это моветон в программировании
RR
Ruslan Ruslan
2 886
Верно все что сказано выше. попросту говоря чтобы не было шото типо этого
for i := 0 to 100 do // бесконечный цикл
begin
i:= 1;
end;
Евгений Щербаков Дело даже не в этом.
По спецификации Паскаля граничные условия FOR-цикла вычисляются ОДНОКРАТНО, в отличие от WHILE- и REPEAT-циклов.