Что такое переменная цикла после цикла For в Delphi? - PullRequest
8 голосов
/ 10 апреля 2010

В Delphi рассмотрим

var
  i: integer;

begin

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

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

Обновление

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

Ответы [ 6 ]

24 голосов
/ 10 апреля 2010

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

7 голосов
/ 10 апреля 2010

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

6 голосов
/ 10 апреля 2010

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

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

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

2 голосов
/ 10 апреля 2010

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

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

- Йерун

1 голос
/ 28 мая 2010

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

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

  1. НИКОГДА не скрывайте подсказки и предупреждения вашего компилятора с {$ Warnings off}!
  2. Научитесь воспринимать информацию как предупреждения, а предупреждения как ошибки!
  3. Оптимизируйте свой код, пока у вас не будет нулевых подсказок и предупреждений (без нарушения правила 1).
1 голос
/ 10 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...