Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

Символьные константы в языке Си

Вопрос больше философского характера, чем технического. По определению константой в языке Си назвается такая переменная, которую нельзя изменять по ходу выполнения программы и такая переменная доступна только для чтения. Вопрос с объявлением числовых констант отпадает сразу - и так ясно, что имеется в виду
int const a = 5;
Такое объявление и описание не вызывает особых трудностей для понимания. Что же подразуемвается под символьной константой? Языком лысого ёжика, это числовой код, которому соответствует символьное отображение (ASCII-код). Но что здесь является константой; в чем выражается неизменность? Что каждому символу соответствует данный код? Но как мы его изменим? Ведь язык не допускает такую конструкцию:
'a' = 666;
Вопрос, на которого я требую ответа: "В чем выражается неизменность символьных констант?"


Ответ

Термин константа в языке С имеет строгое определение. По определению, термин константа обозначает именно и только буквальные литеральные значения: 25, 'f', 0x13, 3.1415. Также термин константа в языке С распространяется на члены перечислений, результат _Alignof и sizeof (с некоторыми исключениями). Это все.
Объекты, объявленные со спецификатором const, константами в языке С не являются. Ваше
int const a = 5;
это ни в коем случае не константа в языке С (!). Это просто, скажем так, "немодифицируемая переменная".
Важность правильного понимания термина константа обуславливается тем, что ряд контекстов в языке С требует использования именно констант и константных выражений. Например, инициализатор для статического объекта должен быть именно константой. Ваше a в этой роли использовать не получится
int const a = 5; static int x = a; // Ошибка - инициализатор не константен
Символьными константами в С называются константы вида 'a' (также сюда можно причислить мультисимвольные константы вида 'abc'). Они не являются lvalue. Не существует никаких корректных конструкций языка С, которые могли бы их изменить. В этом и заключается их "неизменность". То есть вторая часть вашего вопроса действительно содержит правильный ответ. Невозможно "изменить" то, что не является lvalue.

Комментариев нет:

Отправить комментарий