A constant expression can be evaluated during compilation rather than at run time, and can be used in any place that a constant can occur. A constant expression cannot contain assignment, increment, decrement, function-call, or comma operators, except when they are within the operand of a sizeof operator. Each constant expression must evaluate to a constant that is in the range of representable values for its type. An integral constant expression has an integral type and contains only operands that are integer constants, enumeration constants, character constants, sizeof expressions, or floating constants that are the immediate operands of casts. Cast operands in an integral constant expression only convert arithmetic types to integral types, except as part of an operand to the sizeof operator.
C allows more latitude for constant expressions in initializers.
An arithmetic constant expression has an arithmetic type and contains only operands that are integer constants, floating constants, enumeration constants, character constants, or sizeof expressions. Cast operators in an arithmetic constant expression only convert arithmetic types to arithmetic types, except as part of an operand to the sizeof operator.