КОНСТАНТНЫЕ ВЫРАЖЕНИЯ
В нескольких случаях в языке C требуются выражения, которые вырабатывают константное значение: после case, в качестве границ массива, и в инициализаторах. В первых двух случаях выражение может включать только целые константы, символьные константы, преобразования к целочисленным типам, константы перечислимых типов и выражения sizeof, быть может соединенные бинарными операциями
+ - * / % & | ^ << >> == != < > <= >= &&
унарными операциями
- ~
или тернарной операцией
? :
Разрешается использовать скобки, но только для группировки, а не для вызова функций.
Несколько больше свободы в случае инициализаторов; кроме константных выражений, указанных выше, можно также использовать вещественные константы и преобразования к произвольным типам, можно применять унарную операцию & к внешним/статическим объектам и к внешним/статическим массивам, индексированным константными выражениями. Унарная операция & может также применяться неявно при появлении функций и непроиндексированных массивов. Основное правило заключается в том, что значения инициализаторов должны быть константами либо адресами предварительно определенных внешних или статических объектов плюс/минус константа.