tags:

views:

53

answers:

2

In fortran 95, if you assign a variable at declaration

integer :: var = 0

it is equivalent to

integer, save :: var = 0

and the variable is therefore preserved after routine execution (is equivalent to static in C speak) and does not get reinitialized when called again. What is the rationale/technical issue behind such (IMHO dangerous) behavior ?

+2  A: 

I don't think that there is some rationale behind such behavior.

But as far as I know, Stefano, you used wrong terminology. In your code there is no assignment statement only variable (var) initialization using initialization expression (0).

integer :: var = 0 ! type declaration & initialization

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

So it seems that it was just committee design decision. If we have such expression (with equality sign in type declaration statement) it is initialization not assignment. And initialization takes place only once during program (and not procedures) execution.

However there might be some historical reasons for such decision. Take a look at this thread.

Today such behavior is dangerous because many other widely used languages follows another conventions about initialization/assignment.

kemiisto
If this is a deliberate design decision, should I maybe post a question "what are Fortran committee members allowed to smoke during decisional meetings?" :) seriously. I don't think they screwed up so badly, so there must be a reason, maybe rooted in compatibility or technical issues. it seems too strange to be a design decision for its own sake.
Stefano Borini
@Stefano: also there might be some historical reasons and not smoking. =) Read this thread: http://www.rhinocerus.net/forum/lang-fortran/92384-initialization-local-variables.html
kemiisto
@kemiisto : I think you just hit the spot! Please edit your answer to include the link.
Stefano Borini
A: 

Many old FORTRAN 77 and earlier compilers statically allocated all variables. Many programmers relied upon this behavior -- this was technically a bug in their programs since unless they used the "SAVE" qualifier in the declaration (or added a plain SAVE statement to every procedure) the value of the variable was undefined upon reentry to a procedure. But since in those days programs tended to be tied to a particular platform and compiler for years, programmers got away with this. This is a very common "gotcha" in porting legacy FORTRAN 77 code to a modern Fortran >= 90 compilers. Most compilers provide compile-time switches to restore this behavior, such as the fno-automatic option of gfortran. Most likely the committee viewed variables that were initialized in their declaration as very likely to need the SAVE attribute -- in my opinion, a reasonable design decision. I think what is most different from other languages, and easiest to confuse the multi-lingual programmer, is that the initialization is done only once.

M. S. B.