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 Тя изглежда като, OK. 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 >> Подобно, интуитивно вероятно знаете, OK. 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 >> C осигурява това, което се нарича директива Препроцесор, които 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 пи като 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 Ако за първи път # определят размера на тесте от 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