我读过,取决于函数结果变量的值是非标准的 Fortran。
integer function my_sum(x, n)
integer, dimension(n), intent(in) :: x
integer , intent(in) :: n
integer :: i
my_sum = 0
do i = 1, n
my_sum = my_sum + x(i) ! Error! Cannot re-use my_sum
end do
end function
Run Code Online (Sandbox Code Playgroud)
相反,我们必须使用局部变量并在函数末尾对其进行赋值。需要明确的是,我并不期望该值在调用之间保存,而是在函数体内保存,就好像它是局部变量一样。
此说法在 Fortran 90 或更高版本中正确吗?它适用于我的编译器(英特尔),但我不确定这是否是标准的,并且除了在线随机大学幻灯片之外还没有找到任何东西。
编辑:我找到了函数名称的来源。它位于本演示文稿的幻灯片 4 中,链接来自官方 fortran-lang.org 网站。
函数中的某处必须有一个或多个如下所示的赋值语句:
函数名 = 表达式
其中表达式的结果保存到函数的名称中。
请注意,函数名称不能出现在任何表达式的右侧。
我不认为你读到的是真的......
对于函数结果变量,除非你的程序做了其他规定,否则它与函数本身具有相同的名称,这是我手头最新版本的语言标准(BS ISO/IEC 1539-1:2018 15.6.2.2 Note 1) 规定:
函数结果类似于函数子程序本地的任何其他实体(变量或过程指针)。它的存在从函数执行开始时开始,到函数执行结束时结束。但是,由于该实体的最终值随后用于调用该函数的表达式的求值,因此实现可能会推迟释放该实体占用的存储空间,直到其值用于表达式求值之后。
我将其解释为意味着您的编译器可以正确编译代码。我还以您的代码所示的方式使用了结果变量,并且不记得曾经遇到过这种用法的问题。
词组
请注意,函数名称不能出现在任何表达式的右侧。
要么是混乱,要么是混乱。表达式在任何有意义的意义上都没有“右侧”。从问题的示例来看,循环内赋值中的表达式是and that 位于赋值my_sum + x(i)的右侧。
把这一点放在一边,似乎还缺少一些东西。文本中的限制很可能是指对递归的限制。考虑(不完整)
function f(n)
f = f(n-1)
end function
Run Code Online (Sandbox Code Playgroud)
这里的名称f不能作为函数来引用。您需要使用结果子句来分隔函数结果的名称和函数本身。
正如 High Performance Mark 所说(我不会详细重复),多次定义函数结果或定义后引用它没有任何限制。
另请注意,引用的陈述的第一部分不正确:
函数中的某处必须有一个或多个如下所示的赋值语句:
函数名 = 表达式
其中表达式的结果保存到函数的名称中。
函数结果必须被定义,但是(即使在 Fortran 90 中)还有其他方法来定义变量而不需要它出现在赋值语句中。作为个人建议,我会避免依赖该文档,因为它缺乏精确性并且明确表示与非常旧的 Fortran 90 标准相关的意图。现代 Fortran 是一个更好的野兽。