Почему константы использования в программировании? [закрытый]

Я просто возвращался по небольшому количеству C, изучающему использование Начала Ivor Horton C книга. Я добрался до бита об объявлении констант, который, кажется, путается с переменными в том же предложении.

Просто для уточнения, каково различие в определении констант и переменных в C, и действительно, когда необходимо использовать константу вместо переменной? Я знаю, что люди говорят для использования константы, когда информация не изменяется во время выполнения программы, но я не могу действительно думать о времени, когда переменная не могла использоваться вместо этого.

28
задан skaffman 3 March 2012 в 14:56
поделиться

9 ответов

Использование констант - это скорее способ защитного программирования, чтобы защитить себя от себя, от случайного изменения значения где-то в коде, когда вы кодируете в 2 a.m. или перед тем, как выпить кофе.

Технически, да, вместо этого можно использовать переменную.

16
ответ дан 28 November 2019 в 02:34
поделиться

Во-в одном, оптимизация производительности.

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

const int spaceTimeDimensions = 4;

if(gpsSattelitesAvailable >= spaceTimeDimensions)
  Good();
10
ответ дан 28 November 2019 в 02:34
поделиться

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

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

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

Относительно того, почему вместо буквальных чисел используются константы:

1) Это делает код более читабельным. Все знают, что такое 3,14 (надеюсь), не все знают, что 3,07 - это ставка подоходного налога в ПА. Это пример знаний о предметной области, и не все, кто будет поддерживать ваш код в будущем (например, налоговое программное обеспечение), будут это знать.

2) Это экономит работу, когда вы вносите изменения. Переходить и менять каждые 3,07 на 3,18, если налоговая ставка изменится в будущем, будет раздражать. Вы всегда хотите минимизировать изменения и, в идеале, внести одно изменение. Чем больше одновременных изменений вы должны внести, тем выше риск того, что вы что-то забудете, что приведет к ошибкам.

3) Вы избегаете рискованных ошибок. Представьте, что было два штата со ставкой налога на прибыль 3,05, а затем один из них изменился на 3,18, а другой остался на уровне 3,07. Просто перейдя и заменив, вы можете столкнуться с серьезными ошибками. Конечно, многие целочисленные или строковые значения констант встречаются чаще, чем «3.07». Например, цифра 7 может обозначать количество дней в неделе и что-то еще. В больших программах очень сложно определить, что означает каждое буквальное значение.

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

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

Например, если у меня есть перечисление дней недели и месяцев, я буду предупрежден, если я добавлю месяц к дню. Если я просто использую целочисленные константы, не будет предупреждений, когда день 3 будет назначен месяцу 3. Вам всегда нужна безопасность типов, и это улучшает читаемость. Перечисления также лучше подходят для определения порядка.Представьте, что у вас есть константы для дней недели, и теперь вы хотите, чтобы ваша неделя начиналась в понедельник, а не в воскресенье.

34
ответ дан 28 November 2019 в 02:34
поделиться

Константа — это когда вы просто хотите поделиться памятью, и она не меняется.

2
ответ дан 28 November 2019 в 02:34
поделиться

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

1
ответ дан 28 November 2019 в 02:34
поделиться

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

char *strcpy(char *dest, const char *src);

В противном случае, например, объявление типа

const int my_magic_no = 54321;

может быть предпочтительнее, чем:

#define MY_MAGIC_NO 54321

по соображениям безопасности типов.

2
ответ дан 28 November 2019 в 02:34
поделиться

Отсутствие константы может означать, что кто-то в командном проекте может объявить где int FORTY_TWO = 42 и сделать его равным FORTY_TWO = 41 в другом месте другим участник команды. Поэтому наступает конец света, и вы также теряете ответ на жизнь. с const , хотя ничего из этого никогда не произойдет. Плюс const хранится в другом месте в памяти по сравнению с хранением обычных переменных и более эффективен.

0
ответ дан 28 November 2019 в 02:34
поделиться

Для низкоуровневого языка, такого как C, константы позволяют несколько оптимизировать компиляцию.

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

3
ответ дан 28 November 2019 в 02:34
поделиться

Константы имеют несколько преимуществ перед переменными.

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

Константы также дают компилятору сильную подсказку для оптимизации. Поскольку компилятор знает, что значение не может измениться, ему не нужно загружать значение из памяти, и он может оптимизировать код для работы только с точным значением константы (например, компилятор может использовать сдвиги для умножения/деления, если const является степенью 2)

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

11
ответ дан 28 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: