[Zenelejátszási] DOUG LLOYD: Rendben. Valami furcsa téma, ugye? Mágikus számok. Milyen doki gondolt, amikor ő beszélünk mágikus számok? Nos, néhány program hogy már írt CS50 mostanáig nem volt valami furcsa szám egyfajta dobott nekik. Talán okokból nem tesszük teljesen értem most. Például, a Mario probléma, mi maximált a magassága a piramis 23. Mi kifejezetten azt mondta, nem mehet nagyobb, mint 23. De mit jelent 23 jelent? Nos, ha elolvasod a spec figyelmesen, Talán láttad, hogy a ok, amiért kupakkal azt 23 azért van, mert a standard magasság A terminál ablak 24. És így, ha az a piramis magasabbak, mint az, talán ezt a fura dolog ahol kifut a képernyőn. És tudod, mit jelent azt jelenti, hogy a szövegekben, ugye? A jelentése a 23. azonnal nyilvánvaló annak, aki nézi a programot és talán más a méretű terminál ablakot? Feltehetőleg nem. Úgy tűnik, mintha, OK. Nos, miért van az, csak kevesebb, mint 23? Általában ez a fajta Egy rossz szokás ténylegesen hogy írjon állandók be a kódot. Ennek során, ha ténylegesen levelet állandót a kódot, ez néha a segítségével bűvös szám, ami valami mi általában szeretnénk arra, hogy elkerülje. Például, vessünk egy pillantást Az egyszerű funkciót itt. Nyilvánvalóan nincs adat típusok: C nevű kártyát vagy fedélzet. Tehát csak a medve velem. Ez egy kicsit pszeudokódja vegyesen itt. Ez egy olyan függvény is foglalkozni kártyát, hogy látszólag vesz egy pakli paraméternek, és a parancs, hogy nekem egy kártyát. És csinálok valamit itt, ahol én Van egy ciklus, ami fut 0-52, és én foglalkozik a kártyát. Nos, most már van egy varázsa szám itt, ugye. Látod, mi a bűvös szám? Vagy ami még fontosabb, mit hogy mi a probléma itt? Különösen akkor, ha ezt a csak egy függvény saját fájlt egy tartalmazó mappát egy csomó különböző fájlokat, amelyek mindegyike nem egy másik dolog, hogy egy pakli kártya. Lehet, hogy megkeveri, vagy foglalkozik a kezét öt lap helyett egy kártyát. Látod, amit a probléma lehet itt? Látod a bűvös szám Már fecskendeznek a kódot? Ez 52, jobbra. Mint, ösztönösen azt bizonyára tudják, az OK gombra. Mint egy normál pakli kártyák tartalmaz 52 lap. De a programunk, ez csak fajta lebeg ott. Olyan ez, mint hirtelen van egy 52. Ennek egyik módja, hogy megoldja ezt probléma az, hogy ezt. Mi nagyon nyíltan most kiabálták a fedélzeten méretű, mint 52. Ez ad neki egy kis intuitívabb jelenti, hogy ha a for ciklus később mondunk, i kevesebb, mint fedélzet méret. Csak úgy tűnik, jobb, mint mondta 52. Most ez valóban megoldja a problémát. Ez nem ad valamilyen szimbolikus vagyis az állandó. De ez nem ilyen ténylegesen vezessenek be egy másik probléma hogy lehet, hogy nem azonnal nyilvánvaló. Még ha ez a változó nyilvánítják globally-- emlékszel, mi azt jelenti, ha kijelentjük egy változó világban versus helyben? Még ha kijelentjük változó globálisan, mi van, ha van Egy másik funkció a csomag a funkciók hogy foglalkoznak-kártya manipuláció hogy véletlenül megváltoztatja a fedélzet mérete, vagy növeli azt 1 vagy csökkenti az 1. Hogy is varázslat baj, ugye? Különösen, ha van dolgunk egy sor Képeslapok, ahol csoszog a teljes fedélzet van szükség. Ha fedélzet mérete csökken 1, például a 51, akkor nem is igazából csoszogó az összes kártya esetleg. Elmegyünk az egyiket ki. És ez az érték úgy is lehet jósolta, vagy kihasználva a rossz színész. C nyújt egy úgynevezett előfeldolgozó direktíva, amely is hívják makró szimbolikus állandók. És valóban, ezt már láttam egy előfeldolgozó direktíva, akkor is, ha még nem hallottam hívják azt a #include. Ez egy újabb példa a makró vagy preprocessor irányelvet. A módja annak, hogy a szimbolikus állandók, vagy névadás állandó úgy, hogy több vagyis, a következő. #define, név, csere. Az igazán fontos félre Itt nagyon gyors. Ne tegyen egy pontosvessző Vége a #define. Szóval ez #define, keresztnév, csere. Amikor a program összeállítása, hogy valójában mi történik a fordító, ha megy hogy menjen át a kódot és minden példányát helyettesíti a "név", amit ki tedd a helyére. Analóg módon, ha #include egyfajta A hasonló másolás és beillesztés, majd #define egyfajta hasonló megtalálni és cserélje, ha valaha is használt, hogy jellemző a szövegszerkesztő programot, például. Így például, ha I #define PI 3.14159265, ha jobban matematikailag hajlik, és hirtelen lásd 3.14159265 repülő körül a kódot, akkor valószínűleg tudja, hogy beszél pi. De talán, hogy ez egy kicsit több szimbolikus jelentése van. És tudjuk helyett mondjuk #define pi, mint falat számok hogy nem fogom tartani olvasás újra és újra. És mi fog történni majd összeállítja az idő, amikor a program összeállított, az első dolog, fog történni fog átmenni és ez váltja minden alkalommal úgy látja, nagybetűvel, a tőke I., ez lesz szó helyébe 3.14 és így tovább, úgy, hogy Nem kell, hogy írja meg minden időben, miközben a program még mindig csak az a szolgáltatás, amit számíthat, mert dolgozik A manipulálni, megszorozzuk, elosztják, bármi is legyen az pi. Ön nem korlátozódik erre helyettesítés csak számok. Például, tudtam #define Természetesen, mint a húr CS50. Ebben az esetben, amikor a program összeállítása, #define megy át a kódot, cserélje minden alkalommal úgy látja, "természetesen" a húr CS50. Észre fogod venni, itt azt is, hogy gyakran #define az én meghatározott szimbolikus állandók, hogy úgy mondjam, Mindig minden sapkák. Ez egy ilyen egyezmény. Ez nem szükséges. Az ok általában az emberek használni nagybetűkké ha ők #defining csak hogy igazán világos, hogy ennek egyes elemeit kódomat egy meghatározott állandó. Ha ez kisbetűs, akkor lehetséges, hogy összekeverhető lenne egy változtatható. És valószínűleg, nem egy jó dolog. Tehát ebben a konkrét megoldás sokkal jobb mint akár a korábbiak. Ha először #define fedélzet mérete 52, majd Most az általam használt 52, vagy a fedélzet mérete itt, sokkal intuitívabb és sokkal biztonságosabb. Nem lehet manipulálni állandó. Nem lehet azt mondani 52 plus plus. Az nem fog átalakítani, hogy 53. Nem tudod megváltoztatni 52 valamire. Meg lehet változtatni a változó amelynek az értéke 52, ez volt az első fix miénk volt. És lehetne növelni hogy a változó a 53. De nem mondhatod, 52 plus plus és Van, hogy hirtelen alakulnak az 52 53. 52 mindig 52. És így nem lehet véletlenül megváltoztat fedélzet mérete itt manipulálásával úgy, Egy másik jó oldala hatása ennek ellenére is hogy tisztában van azzal, hogy nem Minden országban szerte a világon használjon egy pakli kártya mérete 52? Például, ez tényleg gyakori Németország használni egy pakli mérete 32, ahol eltávolítják néhány Az alacsonyabb értéket kártyák. És ebben az esetben, azt akarta port lakosztályomba funkciót, amely foglalkozik kártya manipuláció Németországba. Tudtam az első fokon azt kimutatta, hogy menjen, és cserélje összes előfordulását 52 kódomat 32. De itt, ha én #define pakli méret 32 legtetején a kódomat, ha kell változtatni, tudom csak megy és a változás, hogy az egyik dolog. Újrafordítani a kódomat, és az összes Hirtelen úgy keresztül terjed. Sőt, meg tudjuk változtatni a fedélzet mérete bármilyen értéket akarunk. Tudok Önt érdeklő egy játék a fedélzeten pickup? Én Doug Lloyd. És ez CS50.