Что такое переменная цикла после цикла For В Delphi?

в Delphi, рассмотрим

var
  i: integer;

begin

  for i := 0 to N do
  begin
    { Code }
  end;

можно подумать, что i = N после for цикл, но гарантирует ли это компилятор Delphi? Можно ли предположить, что переменная цикла равна ее последнему значению внутри цикла после Delphi if петли?

обновление

попробовав несколько простых циклов, я подозреваю, что i фактически равна один плюс последнее значение i внутри цикла после петля... Но можете ли вы положиться на это?

6 ответов


нет, Delphi не гарантирует никакого значения. Вне цикла переменная не определена - и IIRC в руководстве по языку неявно указано так-это означает, что новые реализации компилятора могут свободно изменять любое значение переменной вне цикла из-за фактической реализации.


компилятор фактически выдает предупреждение, если вы используете переменную цикла после цикла, поэтому вы должны считать ее неопределенной.


Я бы предложил использовать while контур четче, если вам нужно использовать индекс цикла после цикла:

i := 0;
while i <= N
begin
    { Code }
    i := i + 1;
end;

после того, как этот цикл завершается, вы знаю это i будет N + 1 (или больше, если N может быть меньше нуля).


даже документирована что переменная цикла от for цикл не определен вне цикла.

на практике: то, что вы получаете от переменной, зависит от настроек компилятора и сложности кода. Я видел, как изменения в коде подталкивают компилятор к другому пути оптимизации, поэтому изменяют значение этой неопределенной переменной.

--jeroen


Как заявили многие люди, переменная I должна быть неопределенной после цикла. В реальном мире он будет определен до последнего значения, которое он имел до "перерыва", или до N + 1, если цикл выполняется до термина. Однако на это поведение нельзя полагаться, поскольку оно четко указано, что оно не должно работать.

также, иногда, Я даже не будет назначен. Я столкнулся с этим поведением в основном с включенной оптимизацией.

для такого кода

I := 1234;
For I := 0 to List.Count - 1 do
begin
  //some code
end;
//Here, I = 1234 if List.Count = 0

Так... Если вы хотите узнать значение I после цикла, лучше назначить его другой переменной перед выходом из цикла.


никогда не полагайтесь на значение переменной for после цикла.

Проверьте вывод компилятора. Компилятор Delphi предупреждает вас об этом. Доверяйте своему компилятору.

  1. никогда не скрывайте подсказки и предупреждения вашего компилятора с помощью {$Warnings off}!
  2. научитесь рассматривать информацию как предупреждения, а предупреждения-как ошибки!
  3. Оптимизируйте свой код до тех пор, пока у вас не будет нулевых подсказок и предупреждений (без нарушения правила 1).