C ++ - постоянная переменная, это правильный термин? - PullRequest
2 голосов
/ 22 января 2011

В конце статьи здесь: http://www.learncpp.com/cpp-tutorial/45-enumerated-types/

Здесь упоминается следующее предложение:

Наконец, как и в случае постоянных переменных , перечислимые типыотображаются в отладчике, что делает их более полезными, чем #defined значения в этом отношении.

Является ли "постоянные переменные" правильным термином для использования?Разве константы не отличаются от переменных?

Спасибо.

Ответы [ 6 ]

8 голосов
/ 22 января 2011

Это переменная в том смысле, что это адресуемый объект, в отличие от литеральной константы , которая не адресуема.

Возможно, это противоречиво, но в стандарте языка термин переменная используется для обозначения адресуемых объектов в целом, а const - для указания адресуемого для чтения адресуемого объекта.

5 голосов
/ 22 января 2011

Константы в C ++ - это особый тип переменных. Я понимаю, что это может звучать противоречиво для здравого смысла, но это так в C ++.

int var1 = 1;
int const var2 = 2;

Разница между ними заключается только в ключевом слове const, которое сообщает компилятору, что значение var2 нельзя изменять после его создания:

var1 = 2; // fine
var2 = 1; // compilation error!

Это простое правило также требует применения дополнительных ограничений для const переменных, например, вы не можете создать не const ссылку на переменную const (иначе вы все равно можете изменить ее значение с помощью этой ссылки). Вам также не разрешено передавать var2 в функцию с подписью f(int& i) по той же причине. Тем не менее, вы можете создавать const ссылки на них, использовать их значения и т. Д., Как и с любой «нормальной» переменной. Так что по большому счету они похожи на любую другую переменную.

3 голосов
/ 22 января 2011

Да, это немного противоречит с точки зрения. Переменные - это вещи, которые различаются по определению, а константы - это вещи, которые не меняются по определению.

Кроме того, в C ++ (и других языках) люди все еще называют их постоянными переменными, потому что мы, по сути, думаем о любом значении с именем в качестве переменной.

Не стесняйтесь просто сказать «постоянный».

2 голосов
/ 22 января 2011

Константа - это переменная. В C ++ (и большинстве языков) определение переменной как константы просто говорит компилятору, что переменная не может быть изменена.

1 голос
/ 22 января 2011

Это явное противоречие в терминах на поверхности, и, вероятно, возникло по историческим причинам («переменная» используется для ссылки на область памяти, связанную с именем и типом).

ОднакоЯ могу попытаться оправдать этот термин: во время компиляции это переменная - до оптимизации она имеет все свойства, которые имеет переменная - занимает память, имеет местоположение и т. Д. - и обрабатывается практически так же.(Напротив, значение, которое вы предоставляете, например, 43423L, 3.141 или литерал somestring, не является переменной.) При runtime оно больше не может быть изменено и рассматривается как постоянное.Это своего рода «переменная однократной записи», которую вы устанавливаете в источнике.

0 голосов
/ 22 января 2011

Так много людей в замешательстве.В 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 к адресу.[Если в стеке, вместо этого смещение от основы кадра]

Так что на самом деле почти все в вашем абстрактном синтаксисе является константой, если вы думаете об этом достаточно сложно:)

...