循环变量是否总是新创建的
Whether loop variables are always freshly created
在下面的代码中,我将变量名 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
Does this mean that the for loop always creates a new loop variable, in a way similar to for (int n = 1; n <= 3; n++)
rather than for (n = 1; n <= 3; n++)
(in C-like languages)?
是的,没错。 Chapel 的 for
、forall
和 coforall
循环分别为其迭代声明新的索引变量。在 forall
和 coforall
的情况下,这是不必要的,因为不同的任务将执行不同的迭代,并且每个任务都需要自己的索引变量副本。我们的 for
循环采用相同的策略以保持一致性和方便性。如果你想修改 Chapel [co
]for
[all
] 循环中的外部变量,你需要在循环体或迭代器表达式中进行。
编译器可以(也许应该)对像您这样的情况发出警告,在这种情况下,循环变量会遮蔽同一范围内的变量,以避免混淆。如果您想提倡这种行为,请考虑为此提交 GitHub issue。
在下面的代码中,我将变量名 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
Does this mean that the for loop always creates a new loop variable, in a way similar to
for (int n = 1; n <= 3; n++)
rather thanfor (n = 1; n <= 3; n++)
(in C-like languages)?
是的,没错。 Chapel 的 for
、forall
和 coforall
循环分别为其迭代声明新的索引变量。在 forall
和 coforall
的情况下,这是不必要的,因为不同的任务将执行不同的迭代,并且每个任务都需要自己的索引变量副本。我们的 for
循环采用相同的策略以保持一致性和方便性。如果你想修改 Chapel [co
]for
[all
] 循环中的外部变量,你需要在循环体或迭代器表达式中进行。
编译器可以(也许应该)对像您这样的情况发出警告,在这种情况下,循环变量会遮蔽同一范围内的变量,以避免混淆。如果您想提倡这种行为,请考虑为此提交 GitHub issue。