=>(等于大于)在 Fortran 中是什么意思?

What does => (equals greater than) mean in Fortran?

我正在查看一些旧的 Fortran 90 代码并遇到了 => 符号:

var => item

它看起来像是被用于某种作业。

在 Google 中搜索 "arrow symbol Fortran""equals greater than symbol Fortran" 没有找到相关的 material.

令人惊讶的是,搜索 "equals arrow symbol Fortran" 会产生一些结果。

"=>" 通常被称为 pointer assignment operator.
(虽然它不是 因为它 returns 没有价值。)

它用于将选定的参考名称与目标相关联:

reference => target

以上可以读作"reference refers to target"

大多数情况下,此引用以 pointer 的形式出现。在这种情况下,您可以说 "reference points to target"。这是一种有助于记住此运算符的作用的方法,因为它的文字外观是一个从引用指向目标的箭头。

进一步使用
其他用途包括为各种项目(例如模块组件、过程,甚至任意表达式)制作本地别名。有关所有这些用途的完整说明,请参阅 .

指针赋值与传统赋值 (=)
这是上面 link 中的一个简单示例,它说明了指针赋值与经典赋值 ("=") 的不同之处。基本上这表明,一旦建立了目标,指针就被视为作为基本语句的目标

pt => x ! pt points to x

y = pt ! y equals x

pt => y ! pt points to y

pt = 17 ! y equals 17

其他资源:
General documentation on Fortran pointers

=> 作为现代 Fortran 中的句法元素出现在六个上下文中,许多但不是全部与指针相关:指针赋值指针初始化; 过程(指针)声明; 类型绑定过程声明协会; 正在重命名。其中大多数之间存在密切联系。松散地,在许多情况下 => 可以被视为提供了一种替代的临时或永久引用另一个实体的方法。然而,在 none 中,=> 充当运算符。1

指针赋值

指针赋值是=>的传统表现形式之一,出现在Fortran 90中,用于将指针与目标相关联,在中有解释。

使用关联重命名

重命名实体使用关联涉及元素=>,是Fortran 90/95 代码中的另一种表现形式。这样的 use 语句就像

use mod_a, c=>a
use mod_b, only : cc => bb

在这样的 use 语句之后,模块实体 abb 以本地名称 ccc 为人所知。

指针初始化

指针初始化很像 => 出现的指针赋值。指针初始化定义了指针的初始指针关联。我们在

等语句中看到了这一点
real, target :: a
real, pointer :: b=>a
real, pointer :: c=>NULL()

通过这种显式初始化,此处的指针 b 最初与 a 关联,而指针 c 最初未关联。这两种形式在现代 Fortran 中很有用,因为在 Fortran 90 中,指针始终以未定义的关联状态开始生命。这里我们知道bc定义了指针关联状态,我们可以使用ASSOCIATED.

对于派生类型组件,此类语法提供默认初始化。

程序声明

与 explicit/default 数据对象的初始化非常相似 => 定义过程指针的初始关联的功能。

procedure(proc_interface), pointer :: proc1 => donkey
procedure(proc_interface), pointer :: proc2 => null()

在这里,proc1 再次最初与过程 donkey 相关联,我们可以有这样的东西

call proc1(...)

就像我们在声明语句外用 donkey 赋值 proc1 指针一样。 proc2 正如预期的那样,最初没有关联。

与派生类型的数据对象组件一样=>可以设置派生类型的过程指针组件的初始关联:

type a
  procedure(proc_interface), pointer :: proc => donkey
end type a

类型绑定过程声明

在概念上与上述内容相关的是在声明类型绑定过程时使用 =>

type a
 contains
  procedure :: proc => donkey
  generic :: assignment(=) => type_a_eq
end type a

此处的类型 a proc 是一个绑定名称,因此 b%proc (对于 b 类型 a 的实体)是一个过程参考。我们还通过 type_a_eq,在左侧定义了 a 类型实体的赋值。

协会

=> 出现在四个关联上下文中。 associatechange teamselect typeselect rank 结构将名称与选择器相关联。

从 Fortran 2003 我们有

associate (a => 1+2)
  ... ! In this block we have an entity named a
end associate

class(*) b   ! b is unlimited polymorphic
select type (a => b)
  type is (real)
    ... ! a is a non-polymorphic real here
end select

我们在 Fortran 2018 中引入了

dimension(..) b  ! b is assumed rank
select rank (a => b)
  rank (1)
    ... ! a is a rank-1 array here
end select

change team (team_value, a[*] => b)
... ! In this block we have a coarray named a
end team

这些关联不同于指针。 associate 块中的 a 不必是(在上面的示例中也不是)变量。


[1] operator的概念在Fortran语言中有精确的定义,比如在Fortran 2008规范的3.2.4中。与许多其他语言不同,赋值(=)本身不是一个操作,而是一个语句。在类 C 语言中,我们可以将 (a=b) 作为返回结果的表达式:这在 Fortran 中不是这种情况。 Fortran 中的指针赋值也是如此。上面的其他情况与这种分配的想法完全不同。在 Fortran 中,即使 = 出现在初始化中也与赋值不同。 =>不能被视为有一个效果。