在下面的代码中,我使用变量名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
结果:
setwd("C:/Users/Landsat")
a<-list.dirs(getwd(),recursive = FALSE )
flist <- list()
stackfile <- list()
for (i in 1:length(a)){
flist[[i]] <- list.files(a[i], recursive = TRUE, full.names = TRUE, pattern = "tif$")
stackfile[[i]] <- stack(flist[[i]])
}
答案 0 :(得分:1)
这是否意味着for循环总是创建一个新的循环变量,类似于
for (int n = 1; n <= 3; n++)
而不是for (n = 1; n <= 3; n++)
(在类C语言中)?
是的,没错。 Chapel的for
,forall
和coforall
循环均为其迭代声明了新的索引变量。在forall
和coforall
情况下,这是必要的,因为不同的任务将执行不同的迭代,并且每个任务都需要它自己的索引变量副本。我们的for
循环采用相同的策略以保持一致性和便利性。如果要在Chapel [co
] for
[all
]循环中修改外部变量,则需要在循环体或迭代器表达式中执行此操作。
编译器可以(也许应该)为像你这样的情况发出警告,其中循环变量在同一范围内隐藏变量,以避免混淆。如果您想倡导此行为,请考虑为其提交GitHub issue。