Fortran 中结果变量的用途是什么?
What is the purpose of result variables in Fortran?
在 Fortran 中,有两种标准方法 return 函数的结果。第一个是通过将函数的 return 值赋给函数名。
function foo()
integer :: foo
foo = 10
end function foo
在 Fortran 90 中标准化的第二种形式是通过 "result" 变量。
function foo result(res)
integer :: res
res = 10
end function foo
调用函数的任一形式 returns 值 10。我的问题是,Fortran 90 委员会引入结果变量的基本原理是什么?他们是否标准化了一种常见的做法?或者他们是否通过不将函数名称与函数结果绑定来允许程序更加模块化。例如,在 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 之前都是如此,当时 variable 的定义发生了变化。对于现代 Fortran,请改用术语 function result.
在 Fortran 中,有两种标准方法 return 函数的结果。第一个是通过将函数的 return 值赋给函数名。
function foo()
integer :: foo
foo = 10
end function foo
在 Fortran 90 中标准化的第二种形式是通过 "result" 变量。
function foo result(res)
integer :: res
res = 10
end function foo
调用函数的任一形式 returns 值 10。我的问题是,Fortran 90 委员会引入结果变量的基本原理是什么?他们是否标准化了一种常见的做法?或者他们是否通过不将函数名称与函数结果绑定来允许程序更加模块化。例如,在 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 之前都是如此,当时 variable 的定义发生了变化。对于现代 Fortran,请改用术语 function result.