# Constant Expressions

A constant expression is an expression that you can use as a kind type parameter, a named constant, or to specify an initial value for an entity. It is evaluated when a program is compiled.

In a constant expression, each operation is intrinsic and each primary is one of the following:

- A constant or subobject of a constant

- A specification inquiry where each designator or function argument is one of the following:

  - A constant expression

  - A variable whose properties inquired about are not assumed, deferred, or defined by an expression that is not a constant expression

- A reference to the transformational function IEEE_SELECTED_REAL_KIND from the intrinsic module IEEE_ARITHMETIC, where each argument is a constant expression

- A kind type parameter of the derived type being defined

- A DO variable within an array constructor where each scalar integer expression of the corresponding DO loop is an constant expression

- Another constant expression enclosed in parentheses, where each subscript, section subscript, substring starting and ending point, and type parameter value is a constant expression

If a constant expression invokes an inquiry function for a type parameter or an array bound of an object, the type parameter or array bound must be specified in a prior specification statement (or to the left of the inquiry function in the same statement). The previous specification cannot be in the same entity declaration.

If a reference to a generic entity is included in a constant expression that is in the specification part of a module or submodule, that generic entity shall have no specific procedures defined subsequent to the constant expression in the module or submodule.

## Examples

Valid constant Expressions
`-1 + 3` |
`SIZE(B)` | ! B is a named constant
`7_2` |
`INT(J, 4)` | ! J is a named constant
`SELECTED_INT_KIND (2)` |

Invalid constant Expressions
`SUM(A)` | Not an allowed function.
`A/4.1 - K**1.2` | Exponential does not have integer power (A and K are named constants).
`HUGE(4.0)` | Argument is not an integer.

Parent topic: Constant and Specification Expressions

## See Also

Array constructors
Specification Expressions
Structure constructors
Intrinsic procedures