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

时间:2013-01-28 15:48:01

标签: 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

将打印

1
2

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

非常感谢! 麦克

1 个答案:

答案 0 :(得分:9)

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

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