[Přehrávání hudby] DOUG LLOYD: Dobře. Druh podivné téma, ne? Magická čísla. Co laň myslel, když je mluvíme o magii čísel? No, některé programy že jsme napsaný v CS50 Doposud měl nějaký divný Čísla druh hodil v nich. Možná, že z důvodů, my ne zcela pochopit právě teď. Například, v problému Mario, jsme limitován výšku pyramidy na 23 ° C. Výslovně jsme vás řekl, Nemůžete jít výš než 23. Ale co 23 znamená? No, pokud jste si přečíst spec opatrně, vám mohli vidět, že Důvod, proč jsme ji omezen na 23 Je tomu tak proto standardní výškou z okna terminálu je 24. A tak pokud máme pyramida být vyšší než to, to by mohlo dělat takový divný věci kde to běží mimo obrazovku. A víte, co dělá to znamená v kontextu, že jo? Je význam 23 okamžitě zřejmé s někým, kdo se podívá na váš program a možná má jiný Velikost okna terminálu? Asi ne. Vypadá to jako, OK. Tak proč je to jen méně než 23? Obecně lze říci, že je to druh špatného zvyku vlastně psát konstanty do kódu. Přitom, když jste vlastně dělat napsat konstantu do kódu, to je někdy odkazoval se na jako použití Magická čísla, což je něco, jsme se obecně chcete vyzkoušet a vyhnout se. Například, pojďme se podívat v této jednoduché funkce zde. Je zřejmé, že to žádná data typu v C s názvem karty nebo paluby. Takže jen mějte se mnou. Je to trochu pseudokód smícháno v sem. Jedná se o funkci s názvem vypořádat kartu, která zjevně bere palubu jako jeho parametr, a vypíše se mi jedna karta. A dělám něco, co tady, kde jsem mají smyčku, která běží od 0 do 52, a já se vypořádat kartu. No, máme magii číslo tady, hned. Vidíte, co je magické číslo je? Nebo je ještě důležitější, že ne vidět, co je problém tady? Zejména pokud je tato je jen jedna funkce ve vlastním souboru v složka, která obsahuje banda jiný soubory, z nichž každý dělá něco jiného k balíčku karet. Možná, že to zamíchá je, nebo společnosti ruku z pěti karet místo jedné karty. Vidíte, co se Problém by mohl být? Vidíte magické číslo Já jsem vstřikuje do kódu? To je 52, vpravo. Stejně jako, intuitivně asi víte, OK. Jako standardním balíčkem karty obsahuje 52 karet. Ale v našem programu, je to jen druh plovoucí kolem tam. Je to jako všechno najednou je tu 52. Jeden způsob, jak vyřešit tento problém Problém je v tom, jak to udělat. Teď jsme velmi výslovně volali velikost paluby 52. Dává to trochu více intuitivní což znamená, když v cyklu for Později jsme se pak říct, že jsem je menší než velikost paluby. Prostě to vypadá lépe, než říkat 52. Teď to však ve skutečnosti problém vyřešit. To se dát nějaké symbolické smysl konstanty. Ale to vlastně druh zavést další problém které nemusí být na první pohled patrné. I když se tato proměnná je deklarován globally-- vzpomínáš si, co to znamená, že když prohlašujeme proměnná globálně proti lokálně? I kdybychom deklarovat proměnnou globálně, co když je tu další funkce v Naše sada funkcí které se zabývají manipulací kartou že nechtěně změní velikost Deck, nebo zvyšuje ji 1 nebo je snižuje o 1. To by mohlo znamenat potíže, že jo? Zvlášť když máme co do činění se souborem karet, kde zamíchání palubu je požadováno. Pokud se sníží velikost paluba 1, například na 51, nejsme vlastně míchání všechny karty možná. Odjíždíme jeden z nich ven. A že hodnota by mohla být možná předpověděl, nebo zneužít špatný herec. C poskytuje to, co se nazývá Směrnice preprocesor, který je také nazýván makro pro vytvářet symbolické konstanty. A ve skutečnosti, které jste již Viděl direktiva preprocesoru, i když jste ji slyšet volal, že se #include. Je to další příklad toho, makro nebo směrnice preprocesor. Způsob, jak vytvořit symbolické konstanty, nebo dávat jméno konstantní tak, že má více což znamená, je následující. #define, název, výměna. Opravdu důležitá stranou Zde opravdu rychle. Nedávejte středník na konec vašich #DEFINEs. Takže je to #define, název, výměna. Je-li váš program sestaven, co se ve skutečnosti děje je kompilátor, pokud jde projít kódu a nahraďte každý výskyt Slovo "name" s tím, co jste dal jako náhradu. Analogicky, pokud #include je trochu z podobně jako kopírování a vkládání, pak #define je trochu podobný najít a nahradit, pokud jste někdy používali tuto funkci v slovo zpracovatelský program, například. Tak například, pokud I #define PI jako 3,14159265, pokud jste lépe matematicky nakloněný a najednou viz 3,14159265 létání kolem v kódu, asi víte, že mluví o pí. Ale možná, že můžeme dát to trochu víc symbolický význam. A můžeme říci, místo toho #define pi jako ta plnými čísel že nebudu mít číst znovu a znovu. A co se stane pak na kompilace čas je, když je program zkompilovaný, první věc, která se stane, je, že bude procházet a nahradí pokaždé vidí velkým P, kapitál I, to bude doslova jej nahradit 3.14 a tak dále, takže si Nemusíte psát, že každý Doba zatímco váš program stále má funkce, které vám Očekáváme, protože pracujete s Manipulace s, násobení, dělení, ať je to cokoliv PI. Ty nejsou omezeny na to substituce pouze čísla. Například bych mohl #define Samozřejmě, jako řetězec CS50. V tomto případě, kdy se Program je sestaven, #define projde kód, nahraďte pokaždé vidí "kurz" se smyčcovým CS50. Určitě jste si všimli zde také, že já často #define všechny mé definované symbolické konstanty, abych tak řekl, jsou vždy ve všech čepice. Je to konvence. Není to nutné. Důvodem obecně lidí bude používat všechny kapitály když jsou #defining je jen, aby to opravdu jasné, že tento konkrétní prvek mém kódu je definovaný konstantní. Pokud by to bylo malé písmeno, je možné, že to by mohlo být zaměňována s proměnnou. A to je asi není dobrá věc. Tak tento konkrétní řešení je mnohem lepší než jeden z těch předchozích. Pokud jsem poprvé #define velikost paluba 52, pak teď můj užívání 52 nebo velikosti paluby zde, je mnohem více intuitivní a mnohem bezpečnější. Nemůžete manipulovat s konstantu. Nemůžete říci, 52 a plus. To nebude převést na 53. Nemůžete změnit 52 na něco. Můžete změnit proměnné jehož hodnota je 52, který byl první fix jsme předtím. A by se mohl zvýšit že proměnná na 53. Ale nemůžete říct, 52 a navíc plus a mají, které se náhle otočit 52 do 53. 52 je vždy 52. A tak si můžete nechtěně změnit velikost paluba zde manipulací to, Dalším dobrým strana Účinek této však je, že jsou si vědomi toho, že ne Všechny země po celém světě použít balíček karet velikosti 52? Například, je to opravdu běžné v Německo použít velikost balíček 32, kde se vyřadit některé nižších karty hodnotou. A v tomto případě, myslím, chtěl přístavu My Suite funkcí, které se zabývají manipulace karty do Německa. Mohl bych v první řadě jsme ukázal, musím jít a nahradit všechny instance 52 v mém kódu s 32. Ale tady, když jsem #define velikost deck as 32 na samém vrcholu mé kódu, když potřebuji ji změnit, můžu prostě jít a změnit, že jedna věc. Překompilovat můj kód, a všechny Najednou to šíří. Ve skutečnosti, můžeme změnit palubu Velikost na libovolnou hodnotu chceme. Mohu zajímat v Hra velikosti palubě vyzvednutí? Jsem Doug Lloyd. A to je CS50.