循环变量是否始终是新创建的

时间:2018-04-20 19:19:15

标签: chapel

在下面的代码中,我使用变量名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]])
}

1 个答案:

答案 0 :(得分:1)

  

这是否意味着for循环总是创建一个新的循环变量,类似于for (int n = 1; n <= 3; n++)而不是for (n = 1; n <= 3; n++)(在类C语言中)?

是的,没错。 Chapel的forforallcoforall循环均为其迭代声明了新的索引变量。在forallcoforall情况下,这是必要的,因为不同的任务将执行不同的迭代,并且每个任务都需要它自己的索引变量副本。我们的for循环采用相同的策略以保持一致性和便利性。如果要在Chapel [co] for [all]循环中修改外部变量,则需要在循环体或迭代器表达式中执行此操作。

编译器可以(也许应该)为像你这样的情况发出警告,其中循环变量在同一范围内隐藏变量,以避免混淆。如果您想倡导此行为,请考虑为其提交GitHub issue