2014-03-03 36 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

相關問題