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