1 00:00:00,000 --> 00:00:02,350 >> [Играет музыка] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 ДАГ Lloyd: Ладно. 4 00:00:06,360 --> 00:00:07,770 Вид странной темы, верно? 5 00:00:07,770 --> 00:00:09,050 Магические числа. 6 00:00:09,050 --> 00:00:12,012 Что он имел в виду самка, когда он говорить о магических чисел? 7 00:00:12,012 --> 00:00:14,220 Ну, некоторые из программ что мы написали в CS50 8 00:00:14,220 --> 00:00:16,660 до сих пор были некоторые странные число вид бросили в них. 9 00:00:16,660 --> 00:00:19,680 Возможно, по причинам, мы не полностью понять прямо сейчас. 10 00:00:19,680 --> 00:00:23,950 Например, в задаче Марио, мы ограничен высоту пирамиды на 23. 11 00:00:23,950 --> 00:00:26,880 Мы явно говорит вам не может пойти выше, чем 23. 12 00:00:26,880 --> 00:00:28,702 >> Но что значит 23? 13 00:00:28,702 --> 00:00:30,410 Ну, если вы читаете спец внимательно, вы 14 00:00:30,410 --> 00:00:32,493 возможно, видели, что Поэтому мы ограничены его на 23 15 00:00:32,493 --> 00:00:36,160 это потому, что стандартной высоте терминального окна 24. 16 00:00:36,160 --> 00:00:38,860 И поэтому, если у нас есть Пирамида быть выше, чем, что, 17 00:00:38,860 --> 00:00:41,290 это может сделать эту вещь странный где он работает с экрана. 18 00:00:41,290 --> 00:00:45,140 И вы знаете, что делает что означает в контексте, верно? 19 00:00:45,140 --> 00:00:48,880 >> Есть смысл сразу видно 23 для кого-то, кто смотрит на вашей программе 20 00:00:48,880 --> 00:00:51,550 и, возможно, имеет различные Размер окно терминала? 21 00:00:51,550 --> 00:00:52,330 Возможно нет. 22 00:00:52,330 --> 00:00:53,080 Похоже,, ОК. 23 00:00:53,080 --> 00:00:55,005 Ну, почему это чуть менее 23? 24 00:00:55,005 --> 00:00:56,880 В общем, это своего рода от вредной привычки на самом деле 25 00:00:56,880 --> 00:00:58,940 написать константы в коде. 26 00:00:58,940 --> 00:01:02,190 При этом, когда вы на самом деле написать константу в вашем коде, 27 00:01:02,190 --> 00:01:05,630 это иногда называют использованием магические числа, которые что-то 28 00:01:05,630 --> 00:01:08,030 мы обычно хотим, чтобы попытаться избежать. 29 00:01:08,030 --> 00:01:12,830 >> Например, давайте взглянем в этой простой функции здесь. 30 00:01:12,830 --> 00:01:15,726 Очевидно, что нет данных введите C называется карту или палубы. 31 00:01:15,726 --> 00:01:16,600 Так что терпите меня. 32 00:01:16,600 --> 00:01:18,910 Это немного псевдокод смешивается здесь. 33 00:01:18,910 --> 00:01:21,050 Эта функция называется дело, по-видимому, что карты 34 00:01:21,050 --> 00:01:26,570 берет колоду в качестве параметра, и выведет меня одна карта. 35 00:01:26,570 --> 00:01:30,990 >> И я делаю что-то здесь, где я есть цикл, который проходит от 0 до 52, 36 00:01:30,990 --> 00:01:33,394 и я дело карту. 37 00:01:33,394 --> 00:01:35,310 Ну, у нас есть магия Количество здесь, прямо. 38 00:01:35,310 --> 00:01:38,790 Вы видите, что магическое число? 39 00:01:38,790 --> 00:01:42,280 Или, что более важно, не так ли видеть, что проблема здесь? 40 00:01:42,280 --> 00:01:44,310 Особенно, если это просто одна функция 41 00:01:44,310 --> 00:01:48,030 в своем собственном файле в Папка, содержащая 42 00:01:48,030 --> 00:01:49,970 кучу разных Файлы, каждый из которых 43 00:01:49,970 --> 00:01:51,670 делает еще одну вещь, чтобы колода карт. 44 00:01:51,670 --> 00:01:57,310 Может быть, это перемешивает их, или наносит руку из пяти карт вместо одной карте. 45 00:01:57,310 --> 00:01:59,420 >> Вы видите, что в Проблема может быть здесь? 46 00:01:59,420 --> 00:02:03,220 Вы видите магическое число Я вводится в коде? 47 00:02:03,220 --> 00:02:04,390 Это 52, правильно. 48 00:02:04,390 --> 00:02:06,440 >> Мол, интуитивно вы, наверное, знаете, хорошо. 49 00:02:06,440 --> 00:02:09,740 Как стандартной колодой из карты содержит 52 карт. 50 00:02:09,740 --> 00:02:12,570 Но в нашей программе, то это просто вид плавающих вокруг там. 51 00:02:12,570 --> 00:02:15,280 Это как вдруг есть 52. 52 00:02:15,280 --> 00:02:18,290 >> Один из способов решить эту проблему Проблема в том, чтобы сделать это. 53 00:02:18,290 --> 00:02:22,724 Мы очень явно Теперь взывая размер палубе 52. 54 00:02:22,724 --> 00:02:25,390 Это дает ему немного более понятным это означает, когда в цикл 55 00:02:25,390 --> 00:02:28,650 позже мы тогда сказать, я меньше, чем размер палубы. 56 00:02:28,650 --> 00:02:32,666 Это только кажется, лучше, чем говорю 52. 57 00:02:32,666 --> 00:02:34,290 Теперь это на самом деле решить проблему. 58 00:02:34,290 --> 00:02:38,460 Это дает некоторое символическое смысл константы. 59 00:02:38,460 --> 00:02:40,820 Но это на самом деле своего рода ввести еще одну проблему 60 00:02:40,820 --> 00:02:43,770 которые не могут быть сразу. 61 00:02:43,770 --> 00:02:45,859 Даже если эта переменная объявлен globally-- 62 00:02:45,859 --> 00:02:47,650 вы можете вспомнить, что это значит, когда мы заявляем, 63 00:02:47,650 --> 00:02:50,500 переменная глобально против локально? 64 00:02:50,500 --> 00:02:53,340 Даже если мы объявляем переменную в глобальном масштабе, что, если есть 65 00:02:53,340 --> 00:02:55,500 другая функция в наш набор функций 66 00:02:55,500 --> 00:02:59,750 что сделка с манипуляцией карты что невольно изменяет размер палубы, 67 00:02:59,750 --> 00:03:02,727 или увеличивает его 1 или уменьшает его на 1. 68 00:03:02,727 --> 00:03:04,060 Это может означать проблемы, верно? 69 00:03:04,060 --> 00:03:08,261 Особенно, если мы имеем дело с набором карт, где перетасовки колоды полную 70 00:03:08,261 --> 00:03:08,760 необходимо. 71 00:03:08,760 --> 00:03:12,804 Если размер палубы уменьшается на 1, например, до 51, 72 00:03:12,804 --> 00:03:14,970 мы на самом деле не шаркая все карты возможно. 73 00:03:14,970 --> 00:03:16,500 Мы уезжаем одного из них. 74 00:03:16,500 --> 00:03:21,680 И, что значение может быть, возможно, или предсказать эксплуатируются плохой актер. 75 00:03:21,680 --> 00:03:24,920 >> С обеспечивает то, что называется Директива препроцессора, которые 76 00:03:24,920 --> 00:03:27,764 также называется макрос создание символических констант. 77 00:03:27,764 --> 00:03:30,180 И в самом деле, вы уже видел директиву препроцессора, 78 00:03:30,180 --> 00:03:32,916 даже если вы еще не слышали его назвать то, что с #include. 79 00:03:32,916 --> 00:03:37,150 Это еще один пример макроса или директива препроцессора. 80 00:03:37,150 --> 00:03:41,290 >> Способ создания символические константы, или давать имя к постоянной 81 00:03:41,290 --> 00:03:43,740 таким образом, что она имеет более означает, заключается в следующем. 82 00:03:43,740 --> 00:03:47,030 #define, имя, замена. 83 00:03:47,030 --> 00:03:49,140 Действительно важно сторону здесь очень быстро. 84 00:03:49,140 --> 00:03:54,180 Не ставьте точку с запятой в конец ваших #defines. 85 00:03:54,180 --> 00:03:57,310 Так что это #define, имя, замена. 86 00:03:57,310 --> 00:03:59,540 >> Когда ваша программа составлена, то, что происходит на самом деле 87 00:03:59,540 --> 00:04:01,740 это компилятор, если происходит пройти через код 88 00:04:01,740 --> 00:04:06,770 и заменить каждый экземпляр слово "имя" с тем, что вы 89 00:04:06,770 --> 00:04:08,860 поместить в качестве замены. 90 00:04:08,860 --> 00:04:13,060 Аналогично, если #include является своего рода из похоже на копирование и вставка, 91 00:04:13,060 --> 00:04:15,700 Затем #define является своего рода похоже, чтобы найти и заменить, 92 00:04:15,700 --> 00:04:19,180 если вы когда-либо использовали эту функцию в программа для обработки текста, например. 93 00:04:19,180 --> 00:04:26,345 >> Так, например, если #define PI 3.14159265, как, 94 00:04:26,345 --> 00:04:28,720 если вы лучше математически наклонных и вы вдруг 95 00:04:28,720 --> 00:04:31,640 см 3.14159265 полет вокруг в коде, 96 00:04:31,640 --> 00:04:33,517 Вы, вероятно, знаете, что это говорит о пи. 97 00:04:33,517 --> 00:04:35,850 Но, может быть, мы можем дать ему немного больше символическое значение. 98 00:04:35,850 --> 00:04:39,850 И мы можем сказать, вместо #define пи как то рот чисел 99 00:04:39,850 --> 00:04:42,110 что я не собираюсь держать читать снова и снова. 100 00:04:42,110 --> 00:04:45,560 >> И то, что произойдет потом на Время компиляции, когда программа 101 00:04:45,560 --> 00:04:48,530 составлен, первое, что произойдет это будет проходить через 102 00:04:48,530 --> 00:04:51,520 и он будет заменить каждый раз, он видит капитала P, капитал I, 103 00:04:51,520 --> 00:04:55,610 это будет буквально заменить его 3,14 и так далее, так что вы 104 00:04:55,610 --> 00:04:58,090 не нужно вводить каждый время, пока ваша программа еще 105 00:04:58,090 --> 00:05:00,631 имеет функциональные возможности, которые вам ожидать, потому что вы работаете 106 00:05:00,631 --> 00:05:05,090 с манипулирования, умножение, деления, то, что это по пи. 107 00:05:05,090 --> 00:05:08,230 >> Вы не ограничивается этим замена только цифр. 108 00:05:08,230 --> 00:05:12,279 Например, я мог бы #define Конечно, как струны CS50. 109 00:05:12,279 --> 00:05:14,070 В этом случае, когда Программа составлена, 110 00:05:14,070 --> 00:05:16,236 #define пойдет через Код, заменить каждый раз, 111 00:05:16,236 --> 00:05:19,900 он видит «курс» со струнным CS50. 112 00:05:19,900 --> 00:05:21,720 >> Вы заметите, здесь И что я часто 113 00:05:21,720 --> 00:05:26,090 #define все мои определяется символическим постоянные, так сказать, 114 00:05:26,090 --> 00:05:28,130 всегда во всех крышек. 115 00:05:28,130 --> 00:05:28,960 Это соглашение. 116 00:05:28,960 --> 00:05:30,170 Это не обязательно. 117 00:05:30,170 --> 00:05:33,900 Причина, как правило люди будут использовать все капиталы, когда они #defining 118 00:05:33,900 --> 00:05:37,590 просто чтобы сделать его действительно ясно, что именно этот элемент моего кода 119 00:05:37,590 --> 00:05:38,820 это определенная константа. 120 00:05:38,820 --> 00:05:43,730 Если бы это было в нижнем регистре, то, возможно, это может быть путать с переменной. 121 00:05:43,730 --> 00:05:46,120 И это, наверное, не очень хорошая вещь, чтобы сделать. 122 00:05:46,120 --> 00:05:48,910 >> Так что это особенно Раствор намного лучше 123 00:05:48,910 --> 00:05:50,550 чем любой из предыдущих. 124 00:05:50,550 --> 00:05:59,950 Если я впервые #define размер колода из 52, то Теперь я использую 52, или размер палубы здесь, 125 00:05:59,950 --> 00:06:01,850 является гораздо более интуитивным и намного безопаснее. 126 00:06:01,850 --> 00:06:03,280 Вы не можете манипулировать константу. 127 00:06:03,280 --> 00:06:05,259 Вы не можете сказать, 52 плюс плюс. 128 00:06:05,259 --> 00:06:06,800 Это не собирается преобразовать его в 53. 129 00:06:06,800 --> 00:06:09,390 Вы не можете изменить что-то 52. 130 00:06:09,390 --> 00:06:12,470 >> Вы можете изменить переменную значение которого составляет 52, 131 00:06:12,470 --> 00:06:14,870 который был первым исправление было раньше. 132 00:06:14,870 --> 00:06:17,000 И вы могли бы увеличить переменная 53. 133 00:06:17,000 --> 00:06:21,100 Но вы не можете сказать, 52 плюс плюс и есть, что вдруг превратить 52 в 53. 134 00:06:21,100 --> 00:06:23,350 52 всегда 52. 135 00:06:23,350 --> 00:06:28,860 И поэтому вы не можете изменить случайно Размер палубы здесь, манипулируя его, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Еще один хороший сторона Эффект этого, хотя это 138 00:06:32,390 --> 00:06:38,310 что вы в виду, что не все страны мира 139 00:06:38,310 --> 00:06:40,690 использовать колоду карт размером 52? 140 00:06:40,690 --> 00:06:45,630 Например, это действительно распространено в Германия использовать размер палубы 32, 141 00:06:45,630 --> 00:06:48,020 где они вырезать некоторые нижних значений карт. 142 00:06:48,020 --> 00:06:50,960 И в этом случае, я хотел порту моя ванная 143 00:06:50,960 --> 00:06:55,390 функций, которые имеют дело с манипуляции с картами Германии. 144 00:06:55,390 --> 00:06:59,440 Я мог в первую очередь мы показали, нужно идти и заменить 145 00:06:59,440 --> 00:07:03,570 все экземпляры 52 в моем коде с 32. 146 00:07:03,570 --> 00:07:07,940 >> Но вот, если бы я #define размер палубы а 32 на самом верху моего кода, 147 00:07:07,940 --> 00:07:11,730 если мне нужно, чтобы изменить его, я могу просто пойти и изменить что-то одно. 148 00:07:11,730 --> 00:07:15,010 Перекомпилировать код, и все Вдруг он распространяется через. 149 00:07:15,010 --> 00:07:18,850 На самом деле, мы можем изменить колоду Размер любое значение мы хотим. 150 00:07:18,850 --> 00:07:22,500 >> Могу ли я заинтересовать Вас в Игра размера палубе пикап? 151 00:07:22,500 --> 00:07:23,430 >> Я Дуг Ллойд. 152 00:07:23,430 --> 00:07:25,840 И это CS50. 153 00:07:25,840 --> 00:07:27,772