Всегда ли заново создаются переменные цикла

В следующем коде я использую имя переменной n как для локальной переменной, так и для счетчика цикла:

proc main()
{
    var n = 700;
    writeln( "n (before loop) = ", n );

    for n in 1..3 {
        writeln( "n = ", n );
    }

    writeln( "n (after loop) = ", n );
}

и результат

n (before loop) = 700
n = 1
n = 2
n = 3
n (after loop) = 700

Значит ли это, что for цикл всегда создает новую переменную цикла, аналогично for (int n = 1; n <= 3; n++) скорее, чем for (n = 1; n <= 3; n++) (на C-подобных языках)?

(Справочная информация) Я играл со следующим кодом, используя refи так как цикл не изменил значение baa во внешнем объеме я предположил, что b вероятно, создается как новая переменная...

proc main()
{
    var baa: int = 700;
    ref b = baa;

    writeln( "baa (before loop) = ", baa );

    for b in 1..3 {
        writeln( "b = ", b, " baa = ", baa );
    }

    writeln( "baa (after loop) = ", baa );
}

Результат:

baa (before loop) = 700
b = 1 baa = 700
b = 2 baa = 700
b = 3 baa = 700
baa (after loop) = 700

1 ответ

Решение

Означает ли это, что цикл for всегда создает новую переменную цикла, аналогично for (int n = 1; n <= 3; n++) скорее, чем for (n = 1; n <= 3; n++) (на C-подобных языках)?

Да это правильно. часовни for, forall, а также coforall каждый цикл объявляет новые индексные переменные для своих итераций. в forall а также coforall В некоторых случаях это делается по необходимости, поскольку разные задачи будут выполнять разные итерации, и каждая из них будет нуждаться в собственной копии индексной переменной. наш for петли принимают ту же стратегию для последовательности и удобства. Если вы хотите изменить внешнюю переменную в часовне [co]for[all], вам нужно сделать это в теле цикла или в выражении итератора.

Компилятор может (и, возможно, должен) выдавать предупреждение для случаев, подобных вашему, в которых переменная цикла скрывает переменную в той же области видимости, чтобы избежать путаницы. Если вы хотите отстаивать такое поведение, рассмотрите вопрос о создании GitHub.

Другие вопросы по тегам