Kernighan, B. W. and Ritchie, D. M. "The 'C' Programming Language"; Chapter 24
24. Константные выражения.
В нескольких местах в языке "C" требуются выражения, которые послевычисления становятся константами: после вариантного префикса case,в качестве границ массивов и в инициализаторах. В первых двухслучаях выражение может содержать только целые константы, символьныеконстанты и выражения sizeof, возможно связанные либо бинарнымиоперациями
+ - * / . % & | << >> == != <> <= >=либо унарными операциями
- ~либо тернарной операцией
?:Круглые скобки могут использоваться для группировки, но не дляобращения к функциям.
В случае инициализаторов допускается большая (ударение на букву о)свобода; кроме перечисленных выше константных выражений можно такжеприменять унарную операцию & к внешним или статическим об'ектам ик внешним или статическим массивам, имеющим в качестве индексовконстантное выражение. Унарная операция & может быть также примененанеявно, в результате появления неиндексированных массивов ифункций. Основное правило заключается в том, что после вычисленияинициализатор должен становится либо константой, либо адресом ранееописанного внешнего или статического об'екта плюс или минус константа.