[Играет музыка] ДАГ Lloyd: Ладно. Вид странной темы, верно? Магические числа. Что он имел в виду самка, когда он говорить о магических чисел? Ну, некоторые из программ что мы написали в CS50 до сих пор были некоторые странные число вид бросили в них. Возможно, по причинам, мы не полностью понять прямо сейчас. Например, в задаче Марио, мы ограничен высоту пирамиды на 23. Мы явно говорит вам не может пойти выше, чем 23. Но что значит 23? Ну, если вы читаете спец внимательно, вы возможно, видели, что Поэтому мы ограничены его на 23 это потому, что стандартной высоте терминального окна 24. И поэтому, если у нас есть Пирамида быть выше, чем, что, это может сделать эту вещь странный где он работает с экрана. И вы знаете, что делает что означает в контексте, верно? Есть смысл сразу видно 23 для кого-то, кто смотрит на вашей программе и, возможно, имеет различные Размер окно терминала? Возможно нет. Похоже,, ОК. Ну, почему это чуть менее 23? В общем, это своего рода от вредной привычки на самом деле написать константы в коде. При этом, когда вы на самом деле написать константу в вашем коде, это иногда называют использованием магические числа, которые что-то мы обычно хотим, чтобы попытаться избежать. Например, давайте взглянем в этой простой функции здесь. Очевидно, что нет данных введите C называется карту или палубы. Так что терпите меня. Это немного псевдокод смешивается здесь. Эта функция называется дело, по-видимому, что карты берет колоду в качестве параметра, и выведет меня одна карта. И я делаю что-то здесь, где я есть цикл, который проходит от 0 до 52, и я дело карту. Ну, у нас есть магия Количество здесь, прямо. Вы видите, что магическое число? Или, что более важно, не так ли видеть, что проблема здесь? Особенно, если это просто одна функция в своем собственном файле в Папка, содержащая кучу разных Файлы, каждый из которых делает еще одну вещь, чтобы колода карт. Может быть, это перемешивает их, или наносит руку из пяти карт вместо одной карте. Вы видите, что в Проблема может быть здесь? Вы видите магическое число Я вводится в коде? Это 52, правильно. Мол, интуитивно вы, наверное, знаете, хорошо. Как стандартной колодой из карты содержит 52 карт. Но в нашей программе, то это просто вид плавающих вокруг там. Это как вдруг есть 52. Один из способов решить эту проблему Проблема в том, чтобы сделать это. Мы очень явно Теперь взывая размер палубе 52. Это дает ему немного более понятным это означает, когда в цикл позже мы тогда сказать, я меньше, чем размер палубы. Это только кажется, лучше, чем говорю 52. Теперь это на самом деле решить проблему. Это дает некоторое символическое смысл константы. Но это на самом деле своего рода ввести еще одну проблему которые не могут быть сразу. Даже если эта переменная объявлен globally-- вы можете вспомнить, что это значит, когда мы заявляем, переменная глобально против локально? Даже если мы объявляем переменную в глобальном масштабе, что, если есть другая функция в наш набор функций что сделка с манипуляцией карты что невольно изменяет размер палубы, или увеличивает его 1 или уменьшает его на 1. Это может означать проблемы, верно? Особенно, если мы имеем дело с набором карт, где перетасовки колоды полную необходимо. Если размер палубы уменьшается на 1, например, до 51, мы на самом деле не шаркая все карты возможно. Мы уезжаем одного из них. И, что значение может быть, возможно, или предсказать эксплуатируются плохой актер. С обеспечивает то, что называется Директива препроцессора, которые также называется макрос создание символических констант. И в самом деле, вы уже видел директиву препроцессора, даже если вы еще не слышали его назвать то, что с #include. Это еще один пример макроса или директива препроцессора. Способ создания символические константы, или давать имя к постоянной таким образом, что она имеет более означает, заключается в следующем. #define, имя, замена. Действительно важно сторону здесь очень быстро. Не ставьте точку с запятой в конец ваших #defines. Так что это #define, имя, замена. Когда ваша программа составлена, то, что происходит на самом деле это компилятор, если происходит пройти через код и заменить каждый экземпляр слово "имя" с тем, что вы поместить в качестве замены. Аналогично, если #include является своего рода из похоже на копирование и вставка, Затем #define является своего рода похоже, чтобы найти и заменить, если вы когда-либо использовали эту функцию в программа для обработки текста, например. Так, например, если #define PI 3.14159265, как, если вы лучше математически наклонных и вы вдруг см 3.14159265 полет вокруг в коде, Вы, вероятно, знаете, что это говорит о пи. Но, может быть, мы можем дать ему немного больше символическое значение. И мы можем сказать, вместо #define пи как то рот чисел что я не собираюсь держать читать снова и снова. И то, что произойдет потом на Время компиляции, когда программа составлен, первое, что произойдет это будет проходить через и он будет заменить каждый раз, он видит капитала P, капитал I, это будет буквально заменить его 3,14 и так далее, так что вы не нужно вводить каждый время, пока ваша программа еще имеет функциональные возможности, которые вам ожидать, потому что вы работаете с манипулирования, умножение, деления, то, что это по пи. Вы не ограничивается этим замена только цифр. Например, я мог бы #define Конечно, как струны CS50. В этом случае, когда Программа составлена, #define пойдет через Код, заменить каждый раз, он видит «курс» со струнным CS50. Вы заметите, здесь И что я часто #define все мои определяется символическим постоянные, так сказать, всегда во всех крышек. Это соглашение. Это не обязательно. Причина, как правило люди будут использовать все капиталы, когда они #defining просто чтобы сделать его действительно ясно, что именно этот элемент моего кода это определенная константа. Если бы это было в нижнем регистре, то, возможно, это может быть путать с переменной. И это, наверное, не очень хорошая вещь, чтобы сделать. Так что это особенно Раствор намного лучше чем любой из предыдущих. Если я впервые #define размер колода из 52, то Теперь я использую 52, или размер палубы здесь, является гораздо более интуитивным и намного безопаснее. Вы не можете манипулировать константу. Вы не можете сказать, 52 плюс плюс. Это не собирается преобразовать его в 53. Вы не можете изменить что-то 52. Вы можете изменить переменную значение которого составляет 52, который был первым исправление было раньше. И вы могли бы увеличить переменная 53. Но вы не можете сказать, 52 плюс плюс и есть, что вдруг превратить 52 в 53. 52 всегда 52. И поэтому вы не можете изменить случайно Размер палубы здесь, манипулируя его, Еще один хороший сторона Эффект этого, хотя это что вы в виду, что не все страны мира использовать колоду карт размером 52? Например, это действительно распространено в Германия использовать размер палубы 32, где они вырезать некоторые нижних значений карт. И в этом случае, я хотел порту моя ванная функций, которые имеют дело с манипуляции с картами Германии. Я мог в первую очередь мы показали, нужно идти и заменить все экземпляры 52 в моем коде с 32. Но вот, если бы я #define размер палубы а 32 на самом верху моего кода, если мне нужно, чтобы изменить его, я могу просто пойти и изменить что-то одно. Перекомпилировать код, и все Вдруг он распространяется через. На самом деле, мы можем изменить колоду Размер любое значение мы хотим. Могу ли я заинтересовать Вас в Игра размера палубе пикап? Я Дуг Ллойд. И это CS50.