C Constant Expressions
A constant expression is evaluated at compile time, not run time, and can be used in any place that a constant can be used. The constant expression must evaluate to a constant that is in the range of representable values for that type. The operands of a constant expression can be integer constants, character constants, floatingpoint constants, enumeration constants, type casts, sizeof expressions, and other constant expressions.
 constantexpression:

conditionalexpression
 conditionalexpression:

logicalORexpression
logicalORexpression ? expression : conditionalexpression
 expression:

assignmentexpression
expression , assignmentexpression
 assignmentexpression:

conditionalexpression
unaryexpression assignmentoperator assignmentexpression
 assignmentoperator: one of

= *= /= %= += –= <<= >>= &= ^= =
The nonterminals for struct declarator, enumerator, direct declarator, directabstract declarator, and labeled statement contain the constantexpression nonterminal.
An integral constant expression must be used to specify the size of a bitfield member of a structure, the value of an enumeration constant, the size of an array, or the value of a case constant.
Constant expressions used in preprocessor directives are subject to additional restrictions. Consequently, they are known as "restricted constant expressions." A restricted constant expression cannot contain sizeof expressions, enumeration constants, type casts to any type, or floatingtype constants. It can, however, contain the special constant expression defined (identifier).