声明和SAVE属性的Fortran赋值

时间:2010-07-28 12:21:20

标签: fortran

在fortran 95中,如果你在声明中指定一个变量

integer :: var = 0

等同于

integer, save :: var = 0

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

2 个答案:

答案 0 :(得分:8)

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

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

integer :: var = 0 ! type declaration & initialization

integer :: var ! type declaration
var = 0        ! assignment

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

然而,这种决定可能有一些历史原因。看看this主题。

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

答案 1 :(得分:6)

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