g77
does not necessarily produce code that, when run, performs
side effects (such as those performed by function invocations)
in the same order as in some other compiler--or even in the same
order as another version, port, or invocation (using different
command-line options) of g77
.
It is never safe to depend on the order of evaluation of side effects. For example, an expression like this may very well behave differently from one compiler to another:
J = IFUNC() - IFUNC()
There is no guarantee that IFUNC
will be evaluated in any particular
order.
Either invocation might happen first.
If IFUNC
returns 5 the first time it is invoked, and
returns 12 the second time, J
might end up with the
value 7
, or it might end up with -7
.
Generally, in Fortran, procedures with side-effects intended to be visible to the caller are best designed as subroutines, not functions. Examples of such side-effects include:
An example of a side-effect that is not intended to be visible to the caller is a function that maintains a cache of recently calculated results, intended solely to speed repeated invocations of the function with identical arguments. Such a function can be safely used in expressions, because if the compiler optimizes away one or more calls to the function, operation of the program is unaffected (aside from being speeded up).