声明和SAVE属性的Fortran赋值

Ste*_*ini 17 fortran

在fortran 95中,如果您在声明中分配变量

integer :: var = 0
Run Code Online (Sandbox Code Playgroud)

它相当于

integer, save :: var = 0
Run Code Online (Sandbox Code Playgroud)

因此,变量在例行执行后保留(相当于staticC语言),并且在再次调用时不会重新初始化.这种(恕我直言,危险)行为背后的理由/技术问题是什么?

Wil*_*cat 10

我不认为这种行为背后有一些理由.

但据我所知,斯特凡诺,你使用了错误的术语.在您的代码中,没有使用初始化表达式(0)的赋值语句仅变量(var)初始化.

integer :: var = 0 ! type declaration & initialization

integer :: var ! type declaration
var = 0        ! assignment
Run Code Online (Sandbox Code Playgroud)

所以它似乎只是委员会的设计决定.如果我们有这样的表达式(在类型声明语句中使用相等符号),则初始化不是赋值.初始化只在程序(而不是程序)执行期间发生一次.

但是,这种决定可能有一些历史原因.看看这个帖子.

今天,这种行为是危险的,因为许多其他广泛使用的语言遵循关于初始化/赋值的另


M. *_* B. 7

许多旧的FORTRAN 77和早期的编译器静态地分配了所有变量.许多程序员依赖于这种行为 - 这在技术上是他们程序中的一个错误,因为除非他们在声明中使用"SAVE"限定符(或者在每个过程中添加了一个简单的SAVE语句),否则在重新进入a时变量的值是未定义的.程序.但是由于在那些日子里,程序往往与特定的平台和编译器联系多年,程序员们却侥幸成功.这是将遗留的FORTRAN 77代码移植到现代Fortran> = 90编译器中非常常见的"问题".大多数编译器都提供编译时开关来恢复此行为,例如gfortran的fno-automatic选项.很可能委员会认为在他们的声明中初始化的变量很可能需要SAVE属性 - 在我看来,这是一个合理的设计决策.我认为与其他语言最不同的是,最容易混淆多语言程序员的是初始化只进行一次.