Так много людей в замешательстве.В K & R C строковый литерал может быть изменен.Следовательно, литералы, являющиеся константами, означающими неизменность, неправильны.В ISO C и C ++ переменные типа T const для некоторых T также могут быть изменены с использованием приведения.Итак, опять же, константа не означает неизменность.Как указывалось выше, @foo, константы часто не имеют свойств переменной из-за оптимизации, и на самом деле семантика часто определяет это.Также не забывайте, что в C и C ++ есть константные выражения , иногда известные как константы времени компиляции, используемые для границ массива, например, вид константы, который никогда не будет путать с переменной, согласитесь?
Итак, вот определение: константа - это привязка имени к значению .С этим определением 1
является константой, потому что это буквальное имя, а привязка неявная.И здесь
enum {x};
void f();
есть две константы, а именно x
и f
: это привязки имен символов (в данном случае оба идентификатора в C ++ operator+
также являются именами, но неидентификатор).
Теперь я покажу вам еще одну константу, которая вас удивит!
int y = 1;
Да, действительно, y
тоже константа!Это привязка имени y
к адресу.[Если в стеке, вместо этого смещение от основы кадра]
Так что на самом деле почти все в вашем абстрактном синтаксисе является константой, если вы думаете об этом достаточно сложно:)