2014-03-03 39 views
11

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

real(8) :: a 
real(8) b 

这两个显然是做同样的事情。这些除了风格之外还有什么区别吗?

我知道我们可以初始化变量,并添加属性如下

real(8), intent(in), parameter :: a = 4, b = 2 

,但除此之外,有没有在刚宣布一个普通的老realinteger没有任何属性,而不是初始化有什么区别?

此外,这是否与SAVE属性有关?在我的一些代码中出现意外行为,并且在调用之间保存了一个函数的结果,这迫使我在每次调用该函数时都明确地将该变量设置为零,即使SAVE属性不是由我设置的。

+0

我不推荐直接使用'real(8)'。使用一个命名常量,并参见http://stackoverflow.com/questions/3170239/fortran-integer4-vs-integer4-vs-integerkind-4 –

回答

9

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

type-spec [ [,attr-spec]... :: ] entities 

在你第一种情况:

type-spec: real(8) 
entities: a and b 

的方括号的语法定义意味着该部分是可选的。但是,如果您指定attr-spec(如intent(in)parameter),则需要::。具体做法是:

[ [, attr-spec] :: ] 

::是可选的,attr-spec是可选的,但如果你给和attr-spec你也必须给::

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

在该实例中:

real :: a=4.5 

=4.5aSAVE ED可以覆盖你的问题的第二部分。

+0

就是这样,默认的保存行为是意外的。再次查看ifort文档可以解答我所有的问题。 ** ::可以被排除**,保存是**非标量局部变量**的默认值。我的变量是一个数组,导致我相信这是数组不是标量的问题。 – Exascale

+1

这可能值得明确说明,初始化也需要'::'以及暗示'SAVE'。 – francescalus

相关问题