DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(g77.info.gz) Order of Side Effects

Info Catalog (g77.info.gz) Equivalence Versus Equality (g77.info.gz) Non-bugs
 
 Order of Side Effects
 ---------------------
 
    `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:
 
    * The generation of random numbers that are intended to influence
      return values.
 
    * Performing I/O (other than internal I/O to local variables).
 
    * Updating information in common blocks.
 
    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).
 
Info Catalog (g77.info.gz) Equivalence Versus Equality (g77.info.gz) Non-bugs
automatically generated byinfo2html