>> [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.