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