Зачем использовать ключевое слово const, если вы уже знаете, что переменная должна быть постоянной?

Многие из книг, которые я читаю, используют ключевое слово const, когда значение переменной не должно изменяться. Помимо указания читателям кода, которые могут вызывать ошибки, если вы изменяете эту переменную (вы можете использовать комментарии для этого), зачем вам это ключевое слово быть частью любого языка программирования? Мне кажется, что если вы не хотите, чтобы переменная была изменена, просто не делайте этого.

Может ли кто-нибудь прояснить это для меня?

Ответ 1

Помимо указания читателям кода, которые могут вызывать ошибки, если вы изменяете эту переменную (вы можете использовать комментарии для этого)

Не "может"; приведет к ошибкам в вашей программе.

  • Компилятор С++ будет применять его с ошибками компиляции и диагностическими сообщениями ( "ошибки компилятора" ), без комментариев;
  • Компилятор AC будет использовать его по большей части, хотя его стандартная библиотека имеет отверстия благодаря наследию, например strchr, и имеет несколько довольно мягких неявных правил преобразования, которые могут позволить вам отказаться от const без реализации это довольно легко. Однако только потому, что вы получили успешную компиляцию, это не означает, что у вас нет ошибок; к сожалению, это означает, что ошибки могут быть небольшими ошибками в вашей программе, а также большими впечатляющими сбоями.

В любом случае ваша программа, как гарантируется, будет содержать внутри нее ошибку.

Мне кажется, что если вы не хотите, чтобы переменная была изменена, просто не делайте этого.

Хорошо, что все хорошо и хорошо, но никто не идеален. Программисты ошибаются. Это позволяет компилятор — который никогда не допускает ошибок (по крайней мере, не обычно); указать их вам.

Это особенно полезно, если вы используете некоторую переменную данных, многие, многие строки кода находятся там, где они были созданы. Чем дальше, тем легче изменить его, не осознавая, что вам не следует. Для больших, сложных кодовых баз это просто обязательный.

В вашей базе кода вы получаете новую меру доказуемости, правильность и стабильность, а также огромный фрагмент возможных причин действительно тонкие и неприятные ошибки. Для вашего компилятора (в некоторых случаях) существуют широкие возможности оптимизации, когда он знает, что после компиляции какое-то значение не изменится.

Мы могли бы перечислять преимущества в течение всего дня, но, действительно, вы не будете полностью их проверять, пока не будете работать над такой кодовой базой.

Фактически, в идеальном мире все переменные будут const по умолчанию, и вам нужно будет объявить их с ключевым словом mutable, чтобы иметь возможность их изменять. С++ - назад.

Ответ 2

По крайней мере, на С++, const использует некоторые функции, кроме того, что документирует ваши намерения другим программистам.

const также может сообщить компилятору некоторые вещи. Например, функция, которая принимает ссылку, например: void f(T &t);, не может принять временный объект в качестве его параметра. Чтобы сделать это, вам нужно const присвоить ссылку, например: void f(T const &t).

Аналогично, для вызова функции-члена в const-объекте функция-член должна быть const квалифицирована как: void T::foo() const {}.

Во встроенной системе const может означать еще больше, возможно, сообщая компилятору о том, где найти данный объект (помещая его в ПЗУ или ОЗУ). const сам по себе не обязательно достаточно сказать, что он "помещает этот объект в ПЗУ", но он все еще часто является предварительным условием.

Аналогично (под С++ 11) const сообщает компилятору о безопасности потоков.

Теперь, несомненно, верно, что вы могли бы определить какой-то другой язык, который (другими способами) имел некоторое сходство с C или С++, который не использовал const этими способами. Результат был бы совсем другим языком. Не зная о своих намерениях, невозможно сказать, как это получится, но это может оказаться ближе к Java или С# (для нескольких примеров), оба из которых несколько похожи на C и С++ в некотором роде, но не в этом конкретном один (т.е. не используйте const, как C и С++ do).

Ответ 3

Помимо обычных соображений программирования, которые уже обсуждались в других ответах, одна вещь, которая касается меня, - это отношение:

Мне кажется, что если вы не хотите, чтобы переменная изменена, просто нет.

Общим правилом является то, что 20% стоимости написания кода расходуется на этапе разработки. Другие 80% потрачены на срок службы кода, обновляя его, сохраняя его и т.д. Это означает, что многие другие люди будут работать над вашим кодом, кроме вас.

Время, потраченное во время разработки, которое позволяет избежать проблем спустя годы, является хорошей инвестицией. Эти усилия включают в себя: написание комментариев; определяющие константы, которые являются константами; и писать явный код, который не полагается на неясные языковые конструкции.

Кроме того, @worlboss, я слышу довольно много нетерпимости. Как некоторые другие комментируют, углеродные единицы совершают ошибки, и все, что может сделать кремниевый блок, чтобы помочь избежать ошибок, оценивается.

Ответ 4

Он сообщает компилятору, что переменная не должна изменяться, поэтому, если кто-то пишет код, который ее модифицирует, компилятор помещает его как ошибку.

Ответ 5

Две причины:

  • документация, связанная с компилятором
  • оптимизация компилятора

Вот хорошее описание от Ян Лэнс Тейлор (который работал над gcc и gold linker):

Первое значение const оказывает реальное влияние на программу. Переменная, объявленная const, может быть скомпилирована иначе, чем переменная, которая не объявлена ​​const.

Второе значение const, с другой стороны, является, фактически, документацией, связанной с компилятором. Компилятор выдаст ошибку, если будет предпринята попытка изменить значение с использованием указателя со знаком const, но объявление такого указателя не изменит сгенерированный код.

Ответ 6

Вот простой пример C:

void PrintList(const struct List *l);
void SortList(struct List *l);
int  CmpList(const struct List *a, const struct List *b);
void AppendList(struct List *l, struct List *m);
void PushList(struct List *l, struct ListNode *n);
void PopList(struct List *l, struct ListNode *n);

Здесь мы имеем небольшой набор функций, которые работают с каким-то списком узлов. Во-первых, даже не зная имена функций, мы сразу видим, какие функции каким-то образом меняют наш список, а какие нет. Функции const, как и в стандартных библиотеках, - это те, которые не меняют ваши данные, и не позволят вам сменить ваши данные. Компилятор C пытается сохранить const -ness указателей, привязанных к данным, которые вы передаете в функции. Поэтому в этом случае я могу быть уверенным, что сравнение двух списков - это не функция, которая меняет их, когда я выполняю отладку во время выполнения, поскольку я защитил себя от случайных изменений моих данных.;)

Ответ 7

Ваш компилятор может сделать большие оптимизации, зная, что переменная не будет изменена: вместо сохранения ее в памяти она непосредственно записывается в исполняемый код операции.

Пример

: у вас есть a и b, вы хотите добавить их, вы делаете + b. Если вы объявляете константу и значение 3, программа будет делать вместо нее 3 + b, что позволит сэкономить память и циклы, потому что не потребуется извлекать значение.

Проблема заключается в том, что ваш компилятор не может знать заранее, если переменные являются постоянными или нет, конечно, он мог бы проанализировать весь код и проверить, были ли вы изменены такие переменные, но это не на 100% уверенно, поскольку будущий код также может его изменить.

Ответ 8

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

Давайте теперь скажем, что я создаю lib, который будет использоваться для дальнейших проектов. Таким образом, это означает, что код, написанный сегодня, должен быть доверен через несколько лет, за такой промежуток времени, вероятно, я забуду, какую переменную не следует изменять (коллеги даже не знают, что можно изменить и что не может). Итак, этот короткий пример объясняет, почему использовать const.

Говоря о комментариях, когда истечет крайний срок, и есть много вещей, которые все еще не работают, комментарии к каждой функции будут просто пустой тратой времени. Однако в некоторых случаях комментарии являются обязательными, потому что из-за первой проблемы (крайний срок) комментарии могут не читаться, потому что большинство из них бесполезны, но важные комментарии также будут пропущены. Поэтому лучше использовать ключевое слово const, которое дает ошибку компиляции и указывает на проблему, а затем записывать и читать много комментариев.

Ответ 9

Это сложный вопрос, потому что ИМО основана на убеждениях. Одна из этих убеждений заключается в том, что вы можете защитить свой код от каких-то изменений, просто добавив больше кода. Конечно, этот дополнительный код используется компилятором, чтобы проверить, все ли в порядке.

Я думаю, что это не всегда правильно, вы не можете защитить свой код от себя или своей команды разработчиков, просто добавляя ключевые слова, на самом деле есть много языков, которые не имеют никаких констант, открытых, закрытых, защищенных, внутренних, int, float, двойные ключевые слова и это не означает, что они не являются хорошими языками.

То же самое происходит с некоторыми шаблонами кода, почему люди тратят впустую столько времени, обсуждая о Singletons!? Если вы хотите иметь только один экземпляр, единственное, что вам нужно сделать, это создать только один экземпляр, вот и все. Такое же мышление повсюду вокруг, взгляните на статьи защитного программирования, опубликованные 10 лет назад, еще раз идею защиты кода с кодом.

В какой-то момент вам нужно решить, где вы хотите установить обязанности, на руках разработчиков или на компиляторах. Однако ни компилятор, ни какой-либо другой инструмент не могут сэкономить код против разработчиков, и по этой причине многие ключевые слова бесполезны или просто способ сообщить что-либо другим разработчикам.

Ответ 10

Константные переменные просто позволяют вам писать более читаемый код.

Наибольшее использование для const почти на всех языках - это позволить нам использовать имена для обозначения значений констант, поэтому вы можете рассказать другим, используя свободный язык, к чему относится это имя, не требуя распространения комментариев в вашем кода и сэкономить время и усилия читателей, чтобы узнать тип параметров и особенности параметров. Конечно, вы также выигрываете, если ваше постоянное значение повторно используется в вашем коде. Ну, такой код может быть более читаемым:

processPages(LETTER_PAPER_WIDTH, LETTER_PAPER_HEIGHT);

... чем это:

processPages(215.9, 279.4); // 8.5 x 11 Inches in millimeters for Letter Papers

В приведенном выше примере вам нужно понять, что каждый параметр, его единица и тип для интерпретации значений, и вам еще нужно проверить его на комментарий, потому что избыточный комментарий вроде этого (те комментарии, которые воспроизводят то, что закодирован) не является надежным и столь полезным комментарием (это плохой комментарий в соответствии с Робертом Мартином в "Чистом кодексе": http://goo.gl/5EyY).

Ответ 11

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

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