Присвоение Фортрана на объявлении и СОХРАНЯЕТ глюк атрибута

В Фортране 95, если Вы присваиваете переменную в объявлении

integer :: var = 0

это эквивалентно

integer, save :: var = 0

и переменная поэтому сохраняется после стандартного выполнения (эквивалентно static в C говорят), и не становится повторно инициализированным при вызове снова. Каково объяснение/технический вопрос позади такого (по моему скромному мнению, опасный) поведение?

17
задан Stefano Borini 28 July 2010 в 12:21
поделиться

2 ответа

Я не думаю, что такое поведение имеет какое-то объяснение.

Но насколько я знаю, Стефано, вы использовали неправильную терминологию. В вашем коде нет оператора присваивания , только инициализация переменной (var) с использованием выражения инициализации (0).

integer :: var = 0 ! type declaration & initialization

integer :: var ! type declaration
var = 0        ! assignment

Похоже, это было всего лишь дизайнерское решение комитета. Если у нас есть такое выражение (со знаком равенства в заявлении объявления типа), это инициализация, а не присвоение. Причем инициализация происходит только один раз во время выполнения программы (а не процедуры).

Однако для такого решения могут быть некоторые исторические причины. Взгляните на этот поток.

Сегодня такое поведение опасно, потому что многие другие широко используемые языки придерживаются других соглашений об инициализации / назначении.

10
ответ дан 30 November 2019 в 14:05
поделиться

Многие старые компиляторы FORTRAN 77 и более ранних версий статически размещали все переменные. Многие программисты полагались на это поведение - технически это было ошибкой в ​​их программах, поскольку, если они не использовали квалификатор «SAVE» в объявлении (или не добавили простой оператор SAVE к каждой процедуре), значение переменной не было определено при повторном входе в процедура. Но поскольку в те дни программы были привязаны к определенной платформе и компилятору годами, программистам это сошло с рук. Это очень распространенная ошибка при переносе устаревшего кода FORTRAN 77 на современные компиляторы Fortran> = 90. Большинство компиляторов предоставляют переключатели времени компиляции для восстановления этого поведения, такие как опция fno-automatic для gfortran. Скорее всего, комитет посчитал, что переменные, которые были инициализированы в их объявлении, скорее всего, нуждаются в атрибуте SAVE - на мой взгляд, это разумное проектное решение. Я думаю, что больше всего отличается от других языков, и проще всего запутать многоязычного программиста, так это то, что инициализация выполняется только один раз.

7
ответ дан 30 November 2019 в 14:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: