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
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
Either invocation might happen first.
IFUNC returns 5 the first time it is invoked, and
returns 12 the second time,
J might end up with the
7, or it might end up with
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).