在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委员会引入结果变量的理由是什么?他们是否标准化了一种常规做法?或者他们通过不将函数名称绑定到函数结果来允许程序更加模块化。例如,在foo()
的第二个版本中,函数foo()
的名称可以更改为bar()
,并且该函数在调用时仍将按预期工作。
但是,我可能错了。有谁知道引入结果变量的实际理由是什么?
答案 0 :(得分:11)
在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,请使用术语功能结果。