Какова Переменная цикла После Для Цикла в Delphi?

В Delphi рассмотреть

var
  i: integer;

begin

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

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

Обновление

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

8
задан Mason Wheeler 9 April 2010 в 22:53
поделиться

6 ответов

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

24
ответ дан 5 December 2019 в 04:46
поделиться

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

7
ответ дан 5 December 2019 в 04:46
поделиться

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

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

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

6
ответ дан 5 December 2019 в 04:46
поделиться

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

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

- jeroen

2
ответ дан 5 December 2019 в 04:46
поделиться

Как многие отмечали, переменная 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 после цикла, то лучше присвоить его другой переменной перед выходом из цикла.

1
ответ дан 5 December 2019 в 04:46
поделиться

НИКОГДА не полагайтесь на значение переменной for после цикла.

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

  1. НИКОГДА не скрывайте подсказки и предупреждения компилятора с помощью {$ Warnings off}!
  2. Научитесь обращаться с информацией как с предупреждениями, а с предупреждениями как с ошибками!
  3. Оптимизируйте свой код, пока у вас не будет НУЛЕВЫХ подсказок и предупреждений (без нарушения правила 1).
1
ответ дан 5 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: