Потому что C абсолютно уверен в программизме и позволяет ему делать много вещей, в том числе глупых: int *x = NULL; x[4] = 12;
будет скомпилирован без ошибок и даже без предупреждений многих компиляторов.
Точнее, const
- это просто обещание программиста, что переменная не должна изменяться, и этот компилятор мог бы рассматривать ее как постоянную, если она может помочь в оптимизации. Но компилятор никогда не будет применять какие-либо правила времени выполнения, чтобы запретить изменение значения константы:
const a = 1;
int *ix = (int *) &a;
*ix = 2;
printf("a=%d\n", a); /* UB : could print 1 or 2 */
будет составлен без предупреждения. Но он будет вызывать неопределенное поведение, потому что вы изменили объект, объявленный как const.
Я считаю, что инициализация переменных const не допускается просто потому, что текущая спецификация C не запрещает ее! В предыдущих версиях инициализация всегда была необязательной. Возможно, будущие версии могут принудительно инициализировать автоматические переменные.
В любом случае глобальная или статическая константная переменная фактически автоматически инициализируется (согласно спецификации языка C. 6.7.9 10): Если объект, имеющий статическую или длительность хранения потоков, не инициализируется , то: ... если он имеет арифметический тип, он инициализируется (положительным или беззнаковым) нолем; ...
Так static const a;
отлично действует как const a
если a
глобальна и в тех случае a=0
.
** Заметка модератора **: Пожалуйста, используйте комментарии для запроса разъяснений/обсуждения заданного вопроса. Спасибо. –