Pointers 什么是=>;(等于大于)Fortran中的平均值?

Pointers 什么是=>;(等于大于)Fortran中的平均值?,pointers,fortran,variable-assignment,fortran90,Pointers,Fortran,Variable Assignment,Fortran90,我正在浏览一些旧的Fortran 90代码,发现了=>符号: var => item 它看起来像是被用于某种任务 在Google上搜索“arrow symbol Fortran”或“等于大于symbol Fortran”并没有提供任何相关资料。令人惊讶的是,搜索“equals arrow symbol Fortran”会得到一些结果 “=>”通常被称为。 (虽然它不是,因为它不返回值。) 它用于将所选引用名称与目标关联: reference => target 上述内容可理解为“

我正在浏览一些旧的Fortran 90代码,发现了
=>
符号:

var => item
它看起来像是被用于某种任务

在Google上搜索“arrow symbol Fortran”或“等于大于symbol Fortran”并没有提供任何相关资料。

令人惊讶的是,搜索“equals arrow symbol Fortran”会得到一些结果

“=>”通常被称为。
(虽然它不是,因为它不返回值。)

它用于将所选引用名称与目标关联:

reference => target
上述内容可理解为“参考系指目标”

最常见的是,这种引用以文本形式出现。在这种情况下,您可以说“目标的参考点”。这是记住此运算符所做操作的一种有用方法,因为它的文字外观是一个从引用指向目标的箭头

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

指针分配与传统分配(=)
下面是上面链接中的一个快速示例,说明指针赋值与经典赋值(“=”)的区别。基本上,这表明一旦建立了目标,指针就被视为基本语句的目标

pt => x ! pt points to x

y = pt ! y equals x

pt => y ! pt points to y

pt = 17 ! y equals 17
其他资源:

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

指针赋值 指针赋值是Fortran 90中出现的
=>
的传统外观之一。它用于将指针与目标关联,并在中进行了说明

使用关联重命名 使用关联的实体重命名涉及元素
=>
,这是Fortran 90/95代码中的另一种外观。这样的
use
语句如下

use mod_a, c=>a
use mod_b, only : cc => bb
在这样一个
use
语句之后,模块实体
a
bb
由本地名称
c
cc
可知

指针初始化 指针初始化非常类似于出现
=>
的指针分配。指针初始化定义指针的初始指针关联。我们在以下声明中看到了这一点:

real, target :: a
real, pointer :: b=>a
real, pointer :: c=>NULL()
通过此显式初始化,此处的指针
b
最初与
a
关联,而指针
c
最初不关联。这两种形式在现代Fortran中很有用,因为在Fortran 90中,指针总是以未定义的关联状态开始使用。这里我们知道
b
c
定义了指针关联状态,我们可以使用
ASSOCIATED

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

程序声明 与数据对象的显式/默认初始化类似,
=>
的特点是定义过程指针的初始关联

procedure(proc_interface), pointer :: proc1 => donkey
procedure(proc_interface), pointer :: proc2 => null()
在这里,
proc1
最初再次与过程
assy
关联,我们可以有如下内容

call proc1(...)
proc1
的指针在声明语句之外被赋值为
assk
时,我们可以做的很多<代码>程序2与预期一样,最初没有关联

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

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\u a\u eq
定义了左侧
a
类型实体的赋值

联想
=>
出现在三个关联上下文中。
关联
选择类型
选择等级
构造将名称与选择器关联

从Fortran 2003开始,我们有

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

在Fortran 2018(当前草案)中引入我们

dimension(..) b  ! b is assumed rank
select rank (a => b)
  rank (1)
    ... ! a is a rank-1 array here
end select
这些关联不同于指针<
associate
块中的code>a不必是变量(在上面的示例中也不是)



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

我无法相信,如果不明确知道这个操作符的名称(特别是对于一种已经存在这么久的语言),要找到它的基本信息是多么困难。希望这次问答能够纠正这种情况。
dimension(..) b  ! b is assumed rank
select rank (a => b)
  rank (1)
    ... ! a is a rank-1 array here
end select