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