>> [Muusika mängib]
DOUG LLOYD: Okei.
Kind of kummaline teema, eks?
Magic numbrid.
Mis doe ta mõtles, kui ta on räägime magic numbrid?
Noh, mõned programmid et me oleme kirjutatud CS50
Seni on olnud mõned imelik numbrid liiki visati neid.
Võib-olla põhjus, miks me seda ei tee täielikult aru kohe.
Näiteks Mario probleem, me piiristatud kõrgus püramiidi temperatuuril 23.
Me selgesõnaliselt öelnud, et sa ei saa minna kõrgem kui 23.
>> Aga mida see 23 tähendab?
Noh, kui sa loed spec hoolikalt, siis
võis näha, et Põhjus, miks me ülempiir on 23
sellepärast, et standard kõrgus terminali aken on 24.
Ja nii, kui meil on Püramiidi olla pikem kui,
see võib teha see imelik asi kus ta jookseb ekraanilt.
Ja sa tead, mida tähendab mis tähendab kontekstis, eks?
>> Kas tähenduses 23 silmatorkavam et keegi, kes vaatab oma programmi
ja võibolla on erinev suurus terminalis?
Ilmselt mitte.
Tundub, OK.
Noh, miks see on pisut vähem kui 23?
Üldiselt see on selline halb harjumus tegelikult
kirjutada konstandid oma koodi.
Seejuures, kui sa tegelikult teha kirjuta pidev oma kood,
See on mõnikord viidatud kui lehe magic numbrid, mis on midagi
me üldiselt tahan proovida ja vältida.
>> Näiteks võtame pilk See lihtne ülesanne siin.
Ilmselt pole andmeid kirjuta C nimetatakse kaardi või tekil.
Nii lihtsalt kanda koos minuga.
See on natuke pseudokoodi segada siin.
See on funktsioon, mida nimetatakse tegeleda kaart, mis ilmselt
võtab teki parameetrina, ja väljund mulle ühe kaardi.
>> Ja ma teen midagi siin, kus ma on silmus, mis jookseb 0-52,
ja ma tegelen kaardi.
Noh, meil on maagia number siin, eks.
Kas sa näed, mida maagiline number on?
Või mis veelgi tähtsam, sa vaata, mis probleem on siin?
Eriti siis, kui see on vaid üks funktsioon
oma faili kaust, mis sisaldab
hunnik erinevaid faile, millest igaüks
teeb teine ​​asi kaardipakk.
Võib-olla see segab neid, või tegeleb käsi viie kaardid asemel ühe kaardi.
>> Kas sa näed, mida probleem võib siin olla?
Kas sa näed maagiline number Olen süstitakse koodi?
See on 52, eks.
>> Like, intuitiivselt te ilmselt teate, OK.
Nagu standard tekk kaardid sisaldab 52 kaarti.
Aga meie programmi, see on lihtsalt Selline ujuvad ringi seal.
See on nagu äkki seal on 52.
>> Üks võimalus selle probleemi lahendamiseks Probleem on selles, et seda teha.
Oleme väga selgelt nüüd hüüdes teki suurus kui 52.
See annab talle veidi selgem mis tähendab, kui on silmus
Hiljem me siis ütleme, i on väiksem kui valim suurusest.
See lihtsalt tundub parem kui öelda 52.
Nüüd see tegelikult probleemi lahendada.
See ei anna mõned sümboolsed mõtestasid konstantne.
Aga see mingi reaalselt tutvustada üks probleem
mis ei pruugi olla kohe selge.
Isegi kui see muutuja kuulutatakse globally--
sa meenutada, mida ta tähendab, kui me tunnistada
muutuva maailma versus kohapeal?
Isegi kui me kuulutame muutuja maailmas, mis siis, kui seal on
teise funktsiooni Meie komplekt funktsioone
et tegeleda kaardi manipulatsioon et kogemata muudab teki suurus,
või suurendab seda 1 või vähendab seda 1.
See võiks õigekirja probleeme, eks?
Eriti kui me tegeleme komplekt kaardimäng, kus lohistades kogu teki
on nõutud.
Kui teki suurus on vähenenud 1, näiteks kuni 51,
me tegelikult ei lohistades kõik kaardid võimalik.
Me lahkume üks neist välja.
Ja et väärtus võiks ehk olla ennustas või ära kasutada halb näitleja.
>> C annab, mida nimetatakse eeltöötluse direktiiv, mis
nimetatakse ka makro luua sümboolne konstandid.
Ja tegelikult olete juba näinud eeltöötluse direktiivi
isegi kui sa ei ole kuulnud seda nimetatakse, et koos #include.
See on järjekordne näide makro või eeltöötluse direktiivi.
>> See, kuidas luua sümboolne konstandid, või anda nime pidev
nii, et see on rohkem mis tähendab, on järgmine.
#define nimi, asendamist.
Tõesti oluline kõrvale siin tõesti kiire.
Ärge pange semikoolon juures Aasta lõpus oma #defines.
Nii et see on #define nimi, asendamist.
>> Kui teie programm on koostatud, Mis tegelikult juhtub
on koostaja kui lähed minna läbi oma koodi
ja asendada igakordne Sõna "nimi" iganes sa
pane asendajana.
Analoogiliselt, kui #include on omamoodi on sarnane kopeerimist ja kleepimist,
siis #define on omamoodi sarnast leida ja asendada,
Kui olete kunagi kasutanud seda funktsiooni tekstitöötluse programmi, näiteks.
>> Nii näiteks, kui ma #define pi nagu 3.14159265,
kui sa oled parem matemaatiliselt valmis ja äkki
vaata 3.14159265 sõidavad ümber oma kood,
te ilmselt teate seda räägib pi.
Aga äkki saame anda talle veidi rohkem sümboolne tähendus.
Ja me saame selle asemel öelda #define pi nagu suutäis numbrid
et ma ei kavatse hoida lugedes ikka ja jälle.
>> Ja mis juhtub siis kompileerimise ajal on siis, kui programm on
koostatud on esimene asi, mis juhtub see läheb läbi
ja see tuleb vahetada iga kord, see näeb kapitali P, kapitali I
see saab sõna otseses mõttes asendada see 3.14 ja nii edasi, nii et teil
ei pea seda iga sel ajal, kui teie programm veel
on funktsionaalsus, mida oodata, sest te töötate
manipuleerides, korrutades, jagamisel, mis see on, mida pi.
>> Te ei ole sellega piiratud asendamine numbreid.
Näiteks, ma ei #define Muidugi, kui string CS50.
Sel juhul, kui Programm on koostatud,
#define läheb läbi koodi, tuleb vahetada iga kord,
see näeb "Loomulikult" string CS50.
>> Märkad siin Samuti, et ma sageli
#define kõik minu määratletud sümboolse konstandid, kui nii võib öelda,
on alati kõik mütsid.
See konventsioon.
See ei ole vajalik.
Põhjuseks enamasti inimesed kasutavad kõik pealinnades, kui nad #defining
on vaid teha seda tõesti selge, et see konkreetne element minu koodi
on kindlaksmääratud konstantne.
Kui see oli väiketähed, siis on võimalik, et see võib segamini ajada muutuv.
Ja see on ilmselt ei ole hea asi, mida teha.
>> Nii et see eriti Lahenduseks on palju parem
kui kumbki eelmised.
Kui ma esimest #define teki suurus 52, siis nüüd on mu kasutamine 52 või teki suurus siin
on palju intuitiivsem ja palju turvalisem.
Sa ei saa manipuleerida pidev.
Sa ei saa öelda 52 pluss pluss.
See ei kavatse muuta see 53.
Sa ei saa muuta 52 midagi.
>> Sa saad muuta muutuja mille väärtus on 52,
mis oli esimene fix meil oli enne.
Ja sa võiksid suurendada et muutuja 53.
Aga sa ei saa öelda 52 pluss pluss ja on, et äkki keerata 52 sisse 53.
52 on alati 52.
Ja nii sa ei saa tahtmatult muuta teki suurus siin manipuleerides see,
>> Teine hea külg mõju see küll on
et kas te olete teadlik, et ei kõik maailma riigid
kasuta kaardipakk suurus 52?
Näiteks, see on tõesti levinud Saksamaa kasutada teki suurus 32,
kus nad ribad mõned madalamat väärtust kaardid.
Ja sel juhul, ma tahtsin port minu suite
funktsioone, mis tegelevad kaardi manipulatsioon Saksamaale.
Ma võiks kõigepealt me näitas, pead minema ja asenda
kõik juhtumid 52 minu kood 32.
>> Aga siin, kui ma #define teki suurus kui 32 ülaservas minu koodi
kui mul on vaja seda muuta, ma ei lihtsalt minna ja muuta, et üks asi.
Kompileeri minu koodi ja kõik äkki see levib.
Tegelikult saame muuta teki suurus mingit väärtust tahame.
>> Kas ma saan teile huvi on mängu teki suurus pikap?
>> Ma olen Doug Lloyd.
Ja see on CS50.