为什么Fortran中存在隐含的SAVE属性?

Mik*_*e D 6 fortran

如果我在Fortran声明语句中初始化变量,则该变量隐式接收SAVE属性,初始化表达式只执行一次.

例如,以下程序

program test
implicit none

    call foo()
    call foo()

contains

    subroutine foo ()
        integer :: i = 0

        i = i + 1
        write(*,*) i
    end subroutine foo
 end program test
Run Code Online (Sandbox Code Playgroud)

将打印

1
2
Run Code Online (Sandbox Code Playgroud)

由于这在许多其他语言中有所不同,我想知道为什么Fortran标准委员会选择了这种行为?

非常感谢!麦克风

Vla*_*r F 10

这主要是由于历史原因.实现了旧编译器(Fortran IV(66)及之前的版本)以主要使用静态内存来生成程序.旧机器甚至没有任何堆栈.因此,程序的行为,因为变量被定义为save.

变量初始化的前身,即DATA语句,更像是定义静态内存的初始内容(类似于程序集中数据段的指令),而不是您可能从C中知道的on调用变量初始化.语法变得类似于后来的C变种.

  • +1; 每当一项公约根本没有任何意义时,答案几乎总是"出于历史原因".第二段在这里最相关; 初始化为`integer :: i = 0`是"like"数据语句,它给你静态(因此"保存")语义.对于那个(恕我直言不充分)的原因,最好只对这个"参数"使用这样的初始化来避免令人讨厌的意外. (3认同)