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