2010-06-01 3 views
23

Я только что перешел немного изучать С, используя книгу Ивора Хортона «Начало книги С». Я добрался до объявления констант, которые, похоже, смешиваются с переменными в том же предложении.Зачем использовать константы в программировании?

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

+0

фиксированной длины сохранить s, где в худшем случае копируется новый массив. –

+0

Для этого вопроса требуется только один контрпример: зачем вы делаете переменную PI переменной? –

+0

@ Hans Passant: Вы уверены, что Pi является постоянным? Пока это измеряется только вблизи Земли. Вы уверены, что он постоянный во всем континууме пространства-времени? – 2010-06-01 22:35:42

ответ

29

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

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

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

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

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

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

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

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

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

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

+3

OP не спрашивает о литералах. вопрос был ПОЧЕМУ БОТЕРЬ, используя константы, когда вещи не меняются ... почему НЕ просто использовать переменные для всего? это не похоже на то, что мы закончим ... –

+1

Я чувствую, что первый абзац моего ответа отвечает: нет необходимости использовать переменную, если она не меняется со временем. Но я уточню это дальше. – Uri

+0

Я бы также добавил: 5) Тип безопасности. – matias

1

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

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

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

const int my_magic_no = 54321; 

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

#define MY_MAGIC_NO 54321 

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

+0

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

+0

Я не думаю, что OP не спрашивает о параметрах, а вместо этого о локальных переменных ... –

+0

Хорошо спасибо Брайану за то, что он указал. Как я еще не заметил - | –

9

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

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

const int spaceTimeDimensions = 4; 

if(gpsSattelitesAvailable >= spaceTimeDimensions) 
    Good(); 
+2

OP фактически не спрашивает о константах против литералов ... но константы против переменных ... –

+0

Тем не менее, это инструмент для чтения. –

1

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

+3

Когда вы хотите поделиться памятью, вы плачете ум. Мой разум в вашем уме ... – 2010-06-01 22:06:17

+2

Ум расплавился? Это как все дрянные и поданные на тосте? –

+0

Итак, в целом, это повышение производительности по сравнению с использованием переменных? –

13

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

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

+0

2ам вы имеете в виду? (наполнитель) – Ponkadoodle

+3

@wallacoloo: Конечно, спасибо. Это то, что происходит при написании ответа в 12 часов.:) – 2010-06-01 22:04:23

+3

Не забывайте, что * sleep * также является защитной тактикой программирования. – Jackson

1

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

6

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

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

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

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

+2

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

2

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

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

0

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

1

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

Для получения дополнительной справки, чувствовать свободно читать одно из следующих статей:

+0

этот сайт хорош для основ .. – yogi

Смежные вопросы