Цикл "for i: = 0 to i" в Паскале - почему это работает? - PullRequest
0 голосов
/ 21 сентября 2018

Я удивлен, что никто еще не спрашивал об этом, потому что это то, что я заметил давно.

По-видимому, в Pascal вы можете использовать одну и ту же переменную как для счетчика цикла, так и для ряда повторений,Следующие два фрагмента кода:

i := 10;
for i:= 0 to i do
begin;
    write(i);
end;

и

for i:= 0 to 10 do
begin;
    write(i);
end;

кажутся эквивалентными, так как оба печатают 012345678910.

Почему это работает, ипочему не не работает на других языках?

1 Ответ

0 голосов
/ 21 сентября 2018

Это работает, потому что в Паскале конечное значение цикла оценивается только один раз , то есть значение i берется во время входа в цикл.

Другими словами, код Паскаля равен , как если бы вы сделали:

someHelpVar := i;
for i := 0 to someHelpVar do

, и это, в свою очередь, эквивалентно:

someHelpVar := i;
i := 0;
while i <= someHelpVar do
begin
  ...
  i := i + 1; // or Inc(i);
end;

На других языках, например C, если вы делаете:

for (i = 0; i <= i; i++)

, вы не делаете то же самое.Конечное значение переоценивается на каждой итерации , то есть не только один раз.Вышеприведенный код выглядит так:

i = 0;
while (i <= i)
{
    ...
    i++;
}

Поскольку это условие всегда истинно, вы получаете бесконечный цикл.


Итак, подведем итог: в Паскале,Конечное значение оценивается только один раз и сохраняется во временной переменной без имени. Это означает, что конечное условие не изменяется с i.В других языках он переоценивается на каждой итерации, а не только один раз.

Примечание:

При выполнении чего-то вроде

  i := 10;
  for i := 0 to i do

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

var
  i, j: Integer;
begin
  i := 10;
  for j := 0 to i do

Как говорится: " Всегда пишите код, как если бы парень, который в конечном итоге будет поддерживать ваш код, будет жестоким психопатом, который знает, где вы живете.Код для удобочитаемости."Источник: https://groups.google.com/d/msg/comp.lang.c++/rYCO5yn4lXw/oITtSkZOtoUJ

...