Подтвердить что ты не робот

Что такое "магические числа" в компьютерном программировании?

Когда люди говорят об использовании "магических чисел" в компьютерном программировании, что они означают?

4b9b3361

Ответ 1

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

Например, следующий фрагмент кода:

sz = sz + 729;

имеет магическое число в нем и будет гораздо лучше написано как:

sz = sz + CAPACITY_INCREMENT;

Некоторые экстремальные взгляды утверждают, что вы никогда не должны иметь никаких чисел в своем коде, кроме -1, 0 и 1, но я предпочитаю несколько менее догматичный вид, так как я сразу узнаю 24, 1440, 86400, 3.1415, 2.71828 и 1.414 - это все зависит от ваших знаний.

Однако, хотя я знаю, что есть 1440 минут в день, я, вероятно, по-прежнему буду использовать идентификатор MINS_PER_DAY, поскольку он значительно упрощает их поиск. Чья сказать, что упомянутый выше прирост мощности также не будет 1440, и вы в конечном итоге измените неправильное значение? Это особенно верно для низких чисел: вероятность двойного использования 37197 относительно низкая, вероятность использования 5 для нескольких вещей довольно высока.

Использование идентификатора означает, что вам не нужно будет проходить через все ваши исходные файлы 700 и изменить 729 на 730 при изменении инкремента мощности. Вы можете просто изменить одну строку:

#define CAPACITY_INCREMENT 729

в

#define CAPACITY_INCREMENT 730

и перекомпилируйте лот.


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

x = x + 4;

в

#define FOUR 4
x = x + FOUR;

Это добавляет абсолютно нулевую дополнительную информацию в ваш код и является пустой тратой времени.

Ответ 2

"магические числа" - это числа, которые появляются в таких выражениях, как

if days == 365

Предполагая, что вы не знали, что было 365 дней в году, вы найдете это выражение бессмысленным. Таким образом, хорошей практикой является присвоение всех "магических" чисел (чисел, имеющих какое-то значение в вашей программе) константе,

DAYS_IN_A_YEAR = 365

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

Ответ 3

Википедия - ваш друг (Magic Number)

Ответ 4

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

#define ZERO 0
#define ONE 1

Если вы сделаете это, я буду охотиться на вас и не проявлять милосердия.

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

Например, у вас может быть магическое число 0x12345678. Если вы видите это магическое число, справедливо предположить, что вы видите файл с правильным форматом. Если вы видите, с другой стороны, 0x78563412, это справедливое предположение, что вы видите версию с одним и тем же файлом с индексированной версией.

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

http://en.wikipedia.org/wiki/File_format#Magic_number

Ответ 5

Большинство ответов до сих пор описывали магическое число как константу, которая не описывается самостоятельно. Будучи немного программистом "старой школы", еще в тот же день мы описали магические числа как любую константу, которой назначается какая-то особая цель, которая влияет на поведение кода. Например, число 999999 или MAX_INT или что-то еще полностью произвольное.

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

Как грубый и ужасно надуманный пример:

while (int i != 99999)
{
  DoSomeCleverCalculationBasedOnTheValueOf(i);      

  if (escapeConditionReached)
  {
    i = 99999;
  }
}

Тот факт, что константа используется или не называется, не является проблемой. В случае моего ужасного примера значение влияет на поведение, но что, если нам нужно изменить значение "i" во время цикла?

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

Ответ 6

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

if (foo == 3) {
    // do something
} else if (foo == 4) {
    // delete all users
}

Ответ 7

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

Например, библиотека связи может принимать параметр Timeout и может определять магическое число "-1" для указания бесконечного таймаута.

Ответ 8

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

Использование магических чисел можно избежать, используя именованные константы.

Ответ 9

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

Ответ 10

В простых и истинных словах магическое число представляет собой трехзначное число, сумма квадратов первых двух цифр равна третьему. Пр-202, as, 2 * 2 + 0 * 0 = 2 * 2. Теперь WAP в java принимает целое число и печатает, является ли это магическим числом или нет.

Ответ 11

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

0

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

ЛОЖЬ неизбежно 0 TRUE не (FALSE), но не обязательно 1! Может быть -1 (0xFFFF)

NULL неизбежно 0 (указатель) И большинство компиляторов разрешают это, если их проверка типов не является абсолютно бешенной.

0 является базовым индексом элементов массива, за исключением языков, которые настолько устарели, что базовый индекс равен "1". Затем можно удобно скопировать (i = 0; я < 32; я ++) и ожидать, что "i" начнется с базы (0) и увеличится до и остановится на 32-1... 32-й член массива или что-то еще.

0 - конец многих строк языка программирования. Значение "остановить здесь".
0 также встроен в инструкции X86 для "эффективного перемещения строк". Экономит много микросекунд.

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

Zero - это ответ, который чаще всего задают программисты на объем работы, которую нужно предпринять, чтобы сделать что-то совершенно тривиальное, например изменить цвет активной ячейки до фиолетового, а не ярко-розового. "Нуль, человек, точно так же, как ноль!"

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

Да, 0 действительно волшебное число. FAR больше магии, чем любая другая ценность. Ничего... гм, приближается.

[email protected]