>> [Glazbom]
Doug LLOYD: U redu.
Vrsta čudno temi, zar ne?
Magic brojevi.
Što Srna je mislio kad je govori o magijskim brojevima?
Pa, neki od programa da smo zapisano u CS50
Do sada su imali neki čudan Brojevi vrsta bačen u njih.
Možda iz razloga što mi ne znamo potpuno razumijem sada.
Na primjer, u Mario problem, kapom visinu piramide na 23.
Mi vam izričito rekao ne može ići više od 23.
>> Ali što znači 23?
Pa, ako ste pročitali spec pažljivo, te
Možda ste vidjeli da je Razlog zbog kojeg smo ga kapom na 23
zato je standardne visine od prozora terminala je 24.
I tako, ako imamo Piramida biti jači od toga,
to može učiniti čudan stvar gdje se radi isključili zaslon.
I znaš, što se to znači u kontekstu, zar ne?
>> Je značenje 23 odmah očiti nekome tko gleda svoj program
a možda ima drugačiji Veličina terminala prozor?
Vjerojatno ne.
Čini se, u redu.
Pa, zašto je samo manje od 23?
U principu, to je vrsta od loše navike zapravo
pisati konstante u kodu.
Na taj način, kada se zapravo učiniti napisati konstantu u kodu,
ponekad se naziva i pomoću Magic Numbers, što je nešto
mi općenito želimo pokušati izbjeći.
>> Na primjer, neka je pogledati U ovom jednostavnom funkcijom ovdje.
Očito nema podataka upišite C zove karticu ili palube.
Dakle, samo nose sa sobom.
To je malo pseudokod mješoviti ovdje.
To je funkcija zove nositi karticu koja očito
ima palubu kao svoj parametar, i izlaz će mi jedna kartica.
>> I ja radim nešto ovdje gdje sam imaju petlju koja ide od 0 do 52,
i ja nositi karticu.
Pa, imamo magiju Broj ovdje, zar ne.
Vidite li što je magija broj?
Ili još važnije, zar ne vidim u čemu je problem ovdje?
Osobito ako je to je samo jedna funkcija
u vlastitoj datoteke na mapa koja sadrži
hrpa različitih slika, od kojih je svaki
ne još jedna stvar na špil karata.
Možda ih je shuffles, ili se bavi ruku od pet kartica umjesto jednu karticu.
>> Vidite li što se Problem bi mogao biti ovdje?
Vidite li čarobnu broj Ja sam ubrizgava u kodu?
To je 52, u pravu.
>> Kao, intuitivno što vjerojatno znate, u redu.
Kao standardnu ​​palube kartica sadrži 52 kartica.
No, u našem programu, to je samo vrsta lebdenje okolo unutra.
To je kao da odjednom postoji 52.
>> Jedan od načina za rješavanje ovog Problem je da to učinite.
Mi smo vrlo jasno sada doziva veličine palube kao 52.
To mu daje malo više intuitivno što znači kad je u for petlji
kasnije mi onda reći, manja od veličine palube.
To samo izgleda bolje nego govori 52.
Sada to zapravo ne riješi problem.
To daje neke simboličke što znači da se na konstantu.
No, to se vrsta zapravo uvesti još jedan problem
da ne bi mogli biti vidljivi odmah.
Čak i ako ta varijabla proglašeno globally--
Sjećate li se što je to znači kad izjavljujemo
varijabla globalno odnosu na lokalnoj razini?
Čak i ako smo proglasiti varijablu na globalnoj razini, što ako postoji
još jedna funkcija u naš paket funkcija
koje se bave manipulacije kartice da nehotice mijenja veličinu palube,
ili ga povećava za 1 ili ga smanjuje za 1.
To bi moglo značiti nevolje, zar ne?
Pogotovo ako imamo posla sa skupa kartica gdje miješanje puni palube
potreban.
Ako je smanjena veličina sunčanje sa 1, na primjer, do 51,
nismo zapravo miješanje sve karte eventualno.
Odlazimo jednog od njih.
I to vrijednost možda mogao biti predvidjeti ili iskorištava loše glumac.
>> C daje ono što se naziva Preprocessoru direktiva, koja
se također naziva makro za stvara simboličke konstante.
A u stvari, već ste Vidio Preprocessor direktive,
čak i ako niste čuli pozvao da se s #include.
To je još jedan primjer makro ili Preprocessoru direktiva.
>> Način stvoriti simboličke konstante, ili davanje naziv konstantna
tako da ima više što znači, kako slijedi.
#define, naziv, zamjena.
Stvarno važna stranu Ovdje stvarno brzo.
Nemojte staviti zarez na kraj svoje #defines.
Dakle, to je #define, naziv, zamjena.
>> Kada je vaš program sastavljen, što se zapravo događa
je prevodilac, ako ide proći kroz kodu
i zamijeniti svaku instancu riječ "ime" u što god
staviti kao zamjenu.
Analogno, ako #include je vrsta slična kopiranja i lijepljenja,
onda #define je vrsta slično pronaći i zamijeniti,
Ako ste ikada koristili tu značajku u Program za obradu teksta, npr.
>> Tako na primjer, ako #define pi kao 3,14159265,
ako si bolji matematički skloni i iznenada
vidi 3,14159265 leti oko u kodu,
vjerojatno znate da pričaju pi.
Ali možda bismo ga može dati malo više simboličko značenje.
I umjesto da se #define reći pi kao da zalogaj brojeva
da neću zadržati čitajući iznova i iznova.
>> A što će se dogoditi onda sastaviti vrijeme kad program
sastavio, prva stvar koja će se dogoditi je da će proći kroz
i to će zamijeniti svaki put vidi kapital P, kapital I,
to doslovno ćete ga zamijeniti s 3.14 i tako dalje, tako da
ne morate upisati se svaki Vrijeme dok vaš program i dalje
ima funkcionalnost koja vam očekivati, jer radite
s manipulira, množenjem, dijeljenjem, bez obzira na to je po pi.
>> Ne ograničavaju to Zamjena samo za brojeve.
Na primjer, mogao sam #define Naravno kao gudački CS50.
U tom slučaju, kada je Program je sastavljen,
#define će proći kroz broj, zamijenite svaki put
vidi "tečaj" uz gudački CS50.
>> Primijetit ćete ovdje i da sam često
#define sve moje definirana simbolična konstante, da se tako izrazim,
su uvijek u svim kape.
To je konvencija.
To nije potrebno.
Razlog općenito ljudi će koristiti svi glavni gradovi kada oni #defining
je samo da bi to stvarno jasno da ovaj element moj broj
je definirana konstantna.
Ako je mala, moguće je da to bi moglo biti zbunjen sa varijablom.
I to je vjerojatno nije dobra stvar za učiniti.
>> Dakle, ovaj Otopina je puno bolje
nego bilo koji od prethodnih.
Ako sam prvi #define veličina palubi 52, a zatim Sada mi je korištenje 52 ili veličini palubi ovdje,
je puno više intuitivan i puno sigurnije.
Ne možete manipulirati konstantu.
Ne može se reći 52 plus plus.
To neće pretvoriti ga u 53.
Ne možeš mijenjati 52 do nečega.
>> Možete promijeniti varijablu čija je vrijednost 52,
koji je prvi popravak smo imali prije.
A ti bi mogao povećati da varijabla do 53.
Ali ne mogu reći 52 plus plus i ima da se iznenada pretvoriti u 52 53.
52 je uvijek 52.
I tako da ne mogu nenamjerno promijeniti Veličina palube ovdje da manipulira,
>> Još jedna dobra strana Učinak ovog, iako je
da ste svjesni da ne sve zemlje diljem svijeta
koristiti špil karata veličine 52?
Na primjer, to je stvarno čest u Njemačka koristiti veličinu palubi 32,
gdje skinuti neke nižih vrijednosti kartica.
I u ovom slučaju, ja htjela luke moj suite
funkcija koje se bave kartice manipulacija u Njemačku.
Sam mogao u prvom stupnju smo pokazali, moraju ići i zamijeniti
svi slučajevi 52 u mom kodu s 32.
>> Ali ovdje, ako sam #define veličina sunčanje kao 32 na samom vrhu moje koda,
ako trebam mijenjati, mogu samo idite i promijeniti tu jednu stvar.
Rekompilirati moj broj, i svi odjednom se širi putem.
Zapravo, možemo promijeniti palube Veličina na bilo koju vrijednost želimo.
>> Mogu li vas zainteresirati u Igra veličine palube kurva?
>> Ja sam Doug Lloyd.
A to je CS50.