В репорте от 22.09.2011 написано:
Цитата:
Procedures INC and DEC may have an explicit increment or decrement. It must be a constant. Also
for INCL and EXCL, x must be a constant.
В более поздних редакциях, Вирт отказался от этого ограничения.
FOR вообще не очень нужен. Если требуется переменный шаг -- надо использовать WHILE. Для случая постоянного шага, FOR теоретически может помочь простому компилятору сгенерить более эффективный код, чем для цикла WHILE, потому что FOR более формализован: инкремент указан в самом операторе цикла, а не прописывается в отдельном операторе присваивания.
Кстати, я что-то не помню случая, когда мне потребовался бы переменный шаг.
Еще вот семантика цикла FOR в разных репортах различается:
2011:
Цитата:
The for statement
FOR v := beg TO end BY inc DO S END
is, if inc > 0, equivalent to
v := beg; lim := end;
WHILE v <= lim DO S; v := v + inc END
and if inc < 0 it is equivalent to
v := beg; lim := end;
WHILE v >= lim DO S; v := v + inc END
2016:
Цитата:
The for statement
FOR v := beg TO end BY inc DO S END
is, if inc > 0, equivalent to
v := beg;
WHILE v <= end DO S; v := v + inc END
and if inc < 0 it is equivalent to
v := beg;
WHILE v >= end DO S; v := v + inc END
Во втором случае end вычисляется в каждой итерации... и мне это не нравится.