«Оценивается статически» не определяется стандартом C.
Если размер массива равен целочисленное константное выражение , массив имеет полный тип с известным постоянным размером.В противном случае это массив переменной длины.
C 2018 6.6 6 определяет целочисленное постоянное выражение :
целочисленное постоянное выражение имеют целочисленный тип и должны иметь только операнды, которые являются целочисленными константами, константами перечисления, символьными константами, sizeof
выражениями, результаты которых являются целочисленными константами, _Alignof
выражениями и плавающими константами, которые являются непосредственными операндами приведений.Операторы приведения в выражении с целочисленной константой должны преобразовывать только арифметические типы в целочисленные типы, кроме как в качестве части операнда к оператору sizeof
или _Alignof
.
Таким образом, в char b[sizeof(a) > 10 ? 10 : sizeof(a)]
вопрос в том, имеет ли sizeof(a)
результат, который является целочисленной константой.C 6.5.3.4 2 сообщает нам:
Оператор sizeof
возвращает размер (в байтах) своего операнда, который может быть выражением или именем типа в скобках.Размер определяется по типу операнда.Результатом является целое число.Если тип операнда является типом массива переменной длины, операнд оценивается;в противном случае, операнд не оценивается, и результатом является целочисленная константа.
Таким образом, если a
не является массивом переменной длины, результатом является целочисленная константа.Если a
является массивом переменной длины, результатом является целое число, но неявно не целочисленная константа.
Таким образом, если a
является массивом переменной длины, то char b[sizeof(a) > 10 ? 10 : sizeof(a)]
объявляет переменную длинумассив.Использование троичного оператора не имеет значения, поскольку определение основано на том факте, что выражение содержит операнды, которых нет в списке, приведенном в 6.6 6, а не на том, присутствует ли троичный оператор.
Если a
не является массивом переменной длины, тогда char b[sizeof(a) > 10 ? 10 : sizeof(a)]
объявляет массив известного постоянного размера.Опять же, троичный оператор не имеет значения;определение в 6.6 6 не упоминает об этом.Таким образом, размер массива является целочисленным выражением с постоянной величиной, и соответствующая реализация C должна принять b
в качестве массива с постоянным размером и разрешить его инициализацию.
Существует одно исключение из вышеприведенного.C 2018 6.6 10 говорит:
Реализация может принимать другие формы константных выражений.
Таким образом, в теории теоретически можно определить sizeof(a) > 10 ? 10 : sizeof(a)
как константное выражение,Опора на это, конечно, не будет переносимой.