Есть ли разница при объявлении переменной с двойной двоеточием
При объявлении переменных существует разница при использовании двойного двоеточия?
real(8) :: a
real(8) b
Оба эти, очевидно, делают то же самое. Есть ли разница между ними, кроме стиля?
Я знаю, что мы можем инициализировать переменные и добавлять атрибуты следующим образом
real(8), intent(in), parameter :: a = 4, b = 2
но кроме того, существует ли какая-либо разница при простом объявлении простого старого real
или integer
без атрибутов и не инициализации?
Кроме того, это имеет какое-либо отношение к атрибуту SAVE
? Некоторое время назад в некоторых из моего кода вел себя неожиданно, и я сохранял результаты функции между вызовами, что заставляло меня явно устанавливать переменную в ноль при каждом вызове функции, даже если атрибут SAVE
не был установлен мной.
Ответы
Ответ 1
В первом примере ::
не нужен и может быть опущен. Общий синтаксис:
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.5
заставляет a
быть SAVE
ed, который может охватывать вторую часть вашего вопроса.