Kernighan, B. W. and Ritchie, D. M. "The 'C' Programming Language"; Chapter 24

# 24. Константные выражения.

В нескольких местах в языке "C" требуются выражения, которые после вычисления становятся константами: после вариантного префикса case, в качестве границ массивов и в инициализаторах. В первых двух случаях выражение может содержать только целые константы, символьные константы и выражения sizeof, возможно связанные либо бинарными операциями

     + - * / . % & | << >> == != <> <= >=

либо унарными операциями

     - ~

либо тернарной операцией

     ?:

Круглые скобки могут использоваться для группировки, но не для обращения к функциям.

В случае инициализаторов допускается большая (ударение на букву о) свобода; кроме перечисленных выше константных выражений можно также применять унарную операцию & к внешним или статическим об'ектам и к внешним или статическим массивам, имеющим в качестве индексов константное выражение. Унарная операция & может быть также применена неявно, в результате появления неиндексированных массивов и функций. Основное правило заключается в том, что после вычисления инициализатор должен становится либо константой, либо адресом ранее описанного внешнего или статического об'екта плюс или минус константа.