Есть ли разница при объявлении переменной с двойной двоеточием

При объявлении переменных существует разница при использовании двойного двоеточия?

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, который может охватывать вторую часть вашего вопроса.