Fortran 用双冒号声明变量时有区别吗

Fortran 用双冒号声明变量时有区别吗,fortran,fortran90,Fortran,Fortran90,在声明变量时,使用双冒号是否有区别 real(8) :: a real(8) b 这两种方法显然做了相同的事情。除了款式之外,这些之间还有什么区别吗 我知道我们可以按如下方式初始化变量和添加属性 real(8), intent(in), parameter :: a = 4, b = 2 但除此之外,当只声明一个没有属性且不初始化的普通旧real或integer时,有什么区别吗 另外,这是否与SAVE属性有关?不久前,我的一些代码出现了意外的行为,我在调用之间保存函数的结果,这迫使我在每次调

在声明变量时,使用双冒号是否有区别

real(8) :: a
real(8) b
这两种方法显然做了相同的事情。除了款式之外,这些之间还有什么区别吗

我知道我们可以按如下方式初始化变量和添加属性

real(8), intent(in), parameter :: a = 4, b = 2
但除此之外,当只声明一个没有属性且不初始化的普通旧
real
integer
时,有什么区别吗


另外,这是否与
SAVE
属性有关?不久前,我的一些代码出现了意外的行为,我在调用之间保存函数的结果,这迫使我在每次调用函数时显式地将变量设置为零,即使我没有设置
SAVE
属性。

在第一个示例中,
是不需要的,可以省略。一般语法为:

type-spec [ [,attr-spec]... :: ] entities
在第一种情况下:

type-spec: real(8)
entities: a and b
语法定义中的方括号表示该部分是可选的。但是,如果指定了一个
attr spec
(如
intent(in)
参数
),则需要
。具体而言:

[ [, attr-spec] :: ]
这意味着
是可选的,
attr spec
是可选的,但是如果您提供和
attr spec
您还必须提供

我怀疑人们只是养成了为每个声明提供
的习惯

在示例中:

real :: a=4.5

=4.5
强制
a
保存,这可能涵盖问题的第二部分。

没错,默认保存行为是意外的。再次查看ifort文档可以回答我的所有问题。对于非标量局部变量,可以排除::并将其保存为默认值。我的变量是一个数组,这让我相信如果数组不是标量的,那么这就是问题所在。值得明确指出的是,初始化还需要
以及
SAVE
。我不建议直接使用
real(8)
。使用命名常量并查看