[Prehrávanie hudby] DOUG LLOYD: Dobre. Druh podivné tému, nie? Magická čísla. Čo laň myslel, keď je hovoríme o mágiu čísel? No, niektoré programy že sme napísaný v CS50 Doteraz mal nejaký divný Čísla druh hodil v nich. Možno, že z dôvodov, my nie úplne pochopiť práve teraz. Napríklad, v probléme Mario, sme limitovaný výšku pyramídy na 23 ° C. Výslovne sme vás povedal, Nemôžete ísť vyššie ako 23. Ale čo 23 znamená? No, ak ste si prečítať spec opatrne, vám mohli vidieť, že Dôvod, prečo sme ju obmedzený na 23 Je tomu tak preto štandardnou výškou z okna terminálu je 24. A tak ak máme pyramída byť vyššie ako to, to by mohlo robiť taký divný veci kde to beží mimo obrazovku. A viete, čo robí to znamená v kontexte, že jo? Je význam 23 okamžite zrejmé s niekým, kto sa pozrie na váš program a možno má iný Veľkosť okna terminálu? Pravdepodobne nie. Vyzerá to ako, OK. Tak prečo je to len menej ako 23? Všeobecne možno povedať, že je to druh zlého zvyku vlastne písať konštanty do kódu. Pritom, keď ste vlastne robiť napísať konštantu do kódu, to je niekedy označovaná ako použitie Magická čísla, čo je niečo, sme sa všeobecne chcete vyskúšať a vyhnúť sa. Napríklad, poďme sa pozrieť v tejto jednoduchej funkcie tu. Je zrejmé, že to žiadne dáta typu v C s názvom karty alebo paluby. Takže len majte so mnou. Je to trochu pseudokód zmiešané v sem. Jedná sa o funkciu s názvom vysporiadať kartu, ktorá zjavne berie palubu ako jeho parameter, a vypíše sa mi jedna karta. A robím niečo, čo tu, kde som majú slučku, ktorá beží od 0 do 52, a ja sa vysporiadať kartu. No, máme mágiu číslo tu, hneď. Vidíte, čo je magické číslo je? Alebo je ešte dôležitejšie, že nie vidieť, čo je problém tu? Najmä ak je táto je len jedna funkcia vo vlastnom súbore v zložka, ktorá obsahuje banda iný súbory, z ktorých každý robí niečo iné k balíčku kariet. Možno, že to zamieša je, alebo spoločnosti ruku z piatich kariet namiesto jednej karty. Vidíte, čo sa Problém by mohol byť? Vidíte magické číslo Ja som vstrekuje do kódu? To je 52, vpravo. Rovnako ako, intuitívne asi viete, OK. Ako štandardným balíčkom karty obsahuje 52 kariet. Ale v našom programe, je to len druh plávajúce okolo tam. Je to ako všetko naraz je tu 52. Jeden spôsob, ako vyriešiť tento problém Problém je v tom, ako to urobiť. Teraz sme veľmi výslovne volali veľkosť paluby 52. Dáva to trochu viac intuitívne čo znamená, keď v cykle for Neskôr sme sa potom povedať, že som je menšia ako veľkosť paluby. Proste to vyzerá lepšie, než hovoriť 52. Teraz to však v skutočnosti problém vyriešiť. To sa dať nejaké symbolické zmysel konštanty. Ale to vlastne druh zaviesť ďalší problém ktoré nemusia byť na prvý pohľad zrejmé. Aj keď sa táto premenná je deklarovaný globally-- spomínaš si, čo to znamená, že keď prehlasujeme premenná globálne proti lokálne? Aj keby sme deklarovať premennú globálne, čo keď je tu ďalšie funkcie v Naša sada funkcií ktoré sa zaoberajú manipuláciou kartou že nechtiac zmení veľkosť Deck, alebo zvyšuje ju 1 alebo je znižuje o 1. To by mohlo znamenať problémy, že jo? Zvlášť keď máme čo do činenia so súborom kariet, kde zamiešanie palubu je nutné. Ak sa zníži veľkosť paluba 1, napríklad na 51, nie sme vlastne miešanie všetky karty možná. Odchádzame jeden z nich von. A že hodnota by mohla byť možná predpovedal, alebo zneužiť zlý herec. C poskytuje to, čo sa nazýva Smernice preprocesor, ktorý je tiež nazývaný makro pre vytvárať symbolické konštanty. A v skutočnosti, ktoré ste už Videl direktíva preprocesoru, aj keď ste ju počuť volal, že sa #include. Je to ďalší príklad toho, makro alebo smernice preprocesor. Spôsob, ako vytvoriť symbolické konštanty, alebo dávať meno konštantné tak, že má viac čo znamená, je nasledujúci. #define, názov, výmena. Naozaj dôležitá stranou Tu naozaj rýchlo. Nedávajte bodkočiarka na koniec vašich #DEFINEs. Takže je to #define, názov, výmena. Ak je váš program zostavený, čo sa v skutočnosti deje je kompilátor, pokiaľ ide prejsť kódu a nahraďte každý výskyt Slovo "name" s tým, čo ste dal ako náhradu. Analogicky, ak #include je trochu z podobne ako kopírovanie a vkladanie, potom #define je trochu podobný nájsť a nahradiť, ak ste niekedy používali túto funkciu v slovo spracovateľský program, napríklad. Tak napríklad, ak I #define PI ako 3,14159265, ak ste lepšie matematicky naklonený a zrazu pozri 3,14159265 lietanie okolo v kóde, asi viete, že hovorí o pi. Ale možno, že môžeme dať to trochu viac symbolický význam. A môžeme povedať, namiesto toho #define pi ako tá plnými čísel že nebudem mať čítať znova a znova. A čo sa stane potom na kompilácie čas je, keď je program skompilovaný, prvá vec, ktorá sa stane, je, že bude prechádzať a nahradí zakaždým vidí veľkým P, kapitál I, to bude doslova ho nahradiť 3.14 a tak ďalej, takže si Nemusíte písať, že každý Doba zatiaľ čo váš program stále má funkcie, ktoré vám Očakávame, pretože pracujete s Manipulácia s, násobenie, delenie, nech je to čokoľvek PI. Tie nie sú obmedzené na to substitúcia iba čísla. Napríklad by som mohol #define Samozrejme, ako reťazec CS50. V tomto prípade, keď sa Program je zostavený, #define prejde kód, nahraďte zakaždým vidí "kurz" sa sláčikovým CS50. Určite ste si všimli tu tiež, že ja často #define všetky moje definované symbolické konštanty, aby som tak povedal, sú vždy vo všetkých čiapky. Je to konvencie. Nie je to nutné. Dôvodom všeobecne ľudí bude používať všetky kapitály keď sú #defining je len, aby to naozaj jasné, že tento konkrétny prvok mojom kódu je definovaný konštantný. Ak by to bolo malé písmeno, je možné, že to by mohlo byť zamieňaná s premennou. A to je asi nie je dobrá vec. Tak tento konkrétny riešenie je oveľa lepší ako jeden z tých predchádzajúcich. Ak som prvýkrát #define veľkosť paluba 52, potom teraz môj užívanie 52 alebo veľkosti paluby tu, je oveľa viac intuitívne a oveľa bezpečnejšie. Nemôžete manipulovať s konštantu. Nemôžete povedať, 52 a plus. To nebude previesť na 53. Nemôžete zmeniť 52 na niečo. Môžete zmeniť premenné ktorého hodnota je 52, ktorý bol prvý fix sme predtým. A by sa mohol zvýšiť že premenná na 53. Ale nemôžete povedať, 52 a navyše plus a majú, ktoré sa náhle otočiť 52 do 53. 52 je vždy 52. A tak si môžete nechtiac zmeniť veľkosť paluba tu manipuláciou to, Ďalším dobrým strana Účinok tejto však je, že sú si vedomí toho, že nie Všetky krajiny po celom svete použiť balíček kariet veľkosti 52? Napríklad, je to naozaj bežné v Nemecko použiť veľkosť balíček 32, kde sa vyradiť niektoré nižších karty hodnotou. A v tomto prípade, myslím, chcel prístavu My Suite funkcií, ktoré sa zaoberajú manipulácia karty do Nemecka. Mohol by som v prvom rade sme ukázal, musím ísť a nahradiť všetky inštancie 52 v mojom kódu s 32. Ale tu, keď som #define veľkosť deck as 32 na samom vrchole mojej kódu, keď potrebujem ju zmeniť, môžem jednoducho ísť a zmeniť, že jedna vec. Překompilovat môj kód, a všetky Zrazu to šíri. V skutočnosti, môžeme zmeniť palubu Veľkosť na ľubovoľnú hodnotu chceme. Môžem zaujímať v Hra veľkosti palube vyzdvihnutie? Som Doug Lloyd. A to je CS50.