在fortran 95中,如果在声明时指定变量
integer :: var = 0
它等同于
integer, save :: var = 0
因此,该变量在例程执行后被保留(相当于C语言中的static
),并且在再次调用时不会重新初始化。这种(危险的)行为背后的理论基础/技术问题是什么?
发布于 2010-07-28 21:48:06
我不认为这样的行为背后有什么理由。
但据我所知Stefano你用错了术语。在您的代码中,没有赋值语句,只有变量()使用初始化表达式(0)进行初始化。
integer :: var = 0 ! type declaration & initialization
integer :: var ! type declaration
var = 0 ! assignment
所以看起来这只是委员会的设计决定。如果我们有这样的表达式(在类型声明语句中带有等号),它是初始化,而不是赋值。并且初始化只在程序(而不是过程)执行期间发生一次。
然而,这样的决定可能有一些历史原因。看一看this线程。
今天,这样的行为是危险的,因为许多其他广泛使用的语言遵循另一种关于初始化/赋值的约定。
发布于 2010-07-28 23:05:00
许多旧的FORTRAN77和更早的编译器静态地分配所有变量。许多程序员依赖于这种行为--从技术上讲,这是他们程序中的一个错误,因为除非他们在声明中使用" SAVE“限定符(或在每个过程中添加一个普通的SAVE语句),否则变量的值在重新进入过程时是未定义的。但由于在那个时代,程序往往与特定的平台和编译器捆绑在一起多年,程序员得以幸免于难。在将遗留的FORTRAN77代码移植到现代>= 90编译器时,这是一个非常常见的“陷阱”。大多数编译器都提供了编译时开关来恢复这种行为,比如gfortran的fno- as选项。委员会认为在声明中初始化的变量很可能需要SAVE属性--在我看来,这是一个合理的设计决策。我认为与其他语言最不同的,也是最容易让会多种语言的程序员感到困惑的是,初始化只进行一次。
https://stackoverflow.com/questions/3352741
复制相似问题