В Delphi рассмотреть
var
i: integer;
begin
for i := 0 to N do
begin
{ Code }
end;
Можно было бы думать это i = N
после for
цикл, но компилятор Delphi гарантирует это? Может каждый делать предположение, что переменная цикла равна своему последнему значению в цикле после Delphi if
цикл?
Обновление
После попытки нескольких простых циклов я подозреваю это i
на самом деле равно одному плюс последнее значение i
в цикле после цикла... Но можно ли полагаться на это?
Нет, Delphi не дает никаких гарантий. Вне цикла переменная не определена - и IIRC в Руководстве по языку явно заявляют об этом - это означает, что новые реализации компилятора могут свободно изменять любое значение, которое переменная может иметь вне цикла из-за фактической реализации.
Компилятор фактически выдает предупреждение, если вы используете переменную цикла после цикла, поэтому вы должны считать ее неопределенной.
Я бы посоветовал более наглядно использовать цикл while
, если вам нужно использовать индекс цикла после цикла:
i := 0;
while i <= N
begin
{ Code }
i := i + 1;
end;
После того, как этот цикл завершится, вы знаете , что i
будет N + 1
(или больше, если N
могло быть меньше нуля).
. Даже задокументировано , что переменная цикла из для
цикл не определен вне цикла.
На практике: то, что вы получаете от переменной, зависит от настроек компилятора и сложности кода. Я видел, как изменения в коде подталкивают компилятор к другому пути оптимизации, поэтому изменяют значение этой неопределенной переменной.
- jeroen
Как многие отмечали, переменная I должна быть неопределенной после цикла. В реальном мире она будет определена в последнее значение, которое она имела перед "прерыванием", или в N + 1, если цикл выполняется до конца. Однако на такое поведение нельзя полагаться, поскольку ясно указано, что оно не должно работать.
Кроме того, иногда I даже не присваивается. Я столкнулся с таким поведением в основном при включенной оптимизации.
Для кода вроде этого
I := 1234;
For I := 0 to List.Count - 1 do
begin
//some code
end;
//Here, I = 1234 if List.Count = 0
Итак... Если вы хотите знать значение I после цикла, то лучше присвоить его другой переменной перед выходом из цикла.
НИКОГДА не полагайтесь на значение переменной for после цикла.
Проверьте вывод вашего компилятора. Об этом вас предупреждает компилятор Delphi. Доверьтесь своему компилятору.