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

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

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

 + - * / . % & | << >> == != <> <= >=
либо унарными операциями
 - ~
либо тернарной операцией
 ?:
Круглые скобки могут использоваться для группировки, но не дляобращения к функциям.

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