在 Fortran 中,有两种标准方法可以从函数返回结果。第一个是通过将函数的返回值分配给函数名。
function foo()
integer :: foo
foo = 10
end function foo
Fortran 90 中标准化的第二种形式是通过“结果”变量。
function foo result(res)
integer :: res
res = 10
end function foo
调用任一形式的函数都会返回值 10。我的问题是,Fortran 90 委员会引入结果变量的基本原理是什么?他们是否标准化了一种常见的做法?或者他们是否允许程序通过不将函数名称与函数结果绑定(bind)来更加模块化。例如,在
foo()
的第二个版本中, 函数名foo()
可以改为bar()
并且该函数在调用时仍将按预期工作。但是,我可能是错的。有谁知道引入结果变量的实际理由是什么?
最佳答案
与result
同时推出是递归。在我们了解递归函数是如何产生的之前,先澄清一下结果变量是什么。
函数结果总是通过结果变量返回,无论是 result
使用与否。1 与 result
结果变量具有指定的名称,没有它,结果变量与函数具有相同的名称。在后一种情况下,名称的使用是对结果变量而不是函数的引用。
所以,如果函数 foo
有结果变量 foo
那么我们不能进行直接递归:
recursive function foo(n)
foo = foo(n-1) ! Oh dear
end function
result
出现这样我们就可以拥有recursive function foo(n) result(res)
res = foo(n-1) ! Yay
end function
[1] 嗯,直到 Fortran 2008 之前都是如此,当时变量的定义发生了变化。对于现代 Fortran,使用术语函数结果代替。
关于fortran - Fortran 中结果变量的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31061507/