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

Цикл for в Дельфи или Паскале

Цикл for собой представляет
for <счетчик цикла>:=s1 to s2 do <тело цикла>;
В теле цикла нельзя самому изменять значение счётчика, но можно ли в нём изменять значения s1 и s2? В плане принято ли так вообще или это моветон?
Сергей К.
Сергей К.
160
В зависимости от компилятора, в теле цикла можно менять даже счетчик цикла (freepascal не позволяет, видимо как и другие современные), просто это нарушает принципы разработки и ведёт к тому, что потом программист будет сражаться с багами в подобном цикле, это же справедливо и для изменений границ в самом цикле.

Во фрипаскале переменные границ можно менять

 program Hello; 
var i, s1, s2:integer;
begin
s1 := 0;
s2 := 10;
for i:=s1 to s2 do begin
writeln ('i = ', i);
if i = 8 then
s2 := 2;
end
end.

но это ни к чему не приводит - компилятор кэширует значения s1 и s2 при первом проходе и их изменение никак не влияет на количество выполнений цикла, он все равно будет выполняться до i = 10;

Старые досовские турбо паскали, насколько помню, вели себя иным образом - все переменные можно было менять, однако если переменную цикла изменить на значение большее s2, то цикл будет продолжаться бесконечно.
Роман Гаджибабаев
Роман Гаджибабаев
30 155
Лучший ответ
Можно менять. Но это моветон в смысле читаемости кода и никак не влияет на собственно цикл.
Аскар Байменов
Аскар Байменов
55 807
Выражения s1 и s2 вычисляются единственный раз - перед началом цикла. И дальше в цикле используются только эти вычисленные значения - независимо от того, как меняются значения переменных, входящих в выражения s1 и s2. Так что можешь делать с этими переменными внутри цикла что угодно - на количестве итераций цикла это никак не скажется.
Настоящий программист пробует, а вдруг.
Сергей Сиганов
Сергей Сиганов
64 521
представь что s2 у тебя это, к примеру, кол-во объектов в коллекции - ты поймаешь эксепшн в цикле если будешь удалять объекты из коллекции (т.е. изменять s2)