1 00:00:00,000 --> 00:00:02,350 >> [Zenelejátszási] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Rendben. 4 00:00:06,360 --> 00:00:07,770 Valami furcsa téma, ugye? 5 00:00:07,770 --> 00:00:09,050 Mágikus számok. 6 00:00:09,050 --> 00:00:12,012 Milyen doki gondolt, amikor ő beszélünk mágikus számok? 7 00:00:12,012 --> 00:00:14,220 Nos, néhány program hogy már írt CS50 8 00:00:14,220 --> 00:00:16,660 mostanáig nem volt valami furcsa szám egyfajta dobott nekik. 9 00:00:16,660 --> 00:00:19,680 Talán okokból nem tesszük teljesen értem most. 10 00:00:19,680 --> 00:00:23,950 Például, a Mario probléma, mi maximált a magassága a piramis 23. 11 00:00:23,950 --> 00:00:26,880 Mi kifejezetten azt mondta, nem mehet nagyobb, mint 23. 12 00:00:26,880 --> 00:00:28,702 >> De mit jelent 23 jelent? 13 00:00:28,702 --> 00:00:30,410 Nos, ha elolvasod a spec figyelmesen, 14 00:00:30,410 --> 00:00:32,493 Talán láttad, hogy a ok, amiért kupakkal azt 23 15 00:00:32,493 --> 00:00:36,160 azért van, mert a standard magasság A terminál ablak 24. 16 00:00:36,160 --> 00:00:38,860 És így, ha az a piramis magasabbak, mint az, 17 00:00:38,860 --> 00:00:41,290 talán ezt a fura dolog ahol kifut a képernyőn. 18 00:00:41,290 --> 00:00:45,140 És tudod, mit jelent azt jelenti, hogy a szövegekben, ugye? 19 00:00:45,140 --> 00:00:48,880 >> A jelentése a 23. azonnal nyilvánvaló annak, aki nézi a programot 20 00:00:48,880 --> 00:00:51,550 és talán más a méretű terminál ablakot? 21 00:00:51,550 --> 00:00:52,330 Feltehetőleg nem. 22 00:00:52,330 --> 00:00:53,080 Úgy tűnik, mintha, OK. 23 00:00:53,080 --> 00:00:55,005 Nos, miért van az, csak kevesebb, mint 23? 24 00:00:55,005 --> 00:00:56,880 Általában ez a fajta Egy rossz szokás ténylegesen 25 00:00:56,880 --> 00:00:58,940 hogy írjon állandók be a kódot. 26 00:00:58,940 --> 00:01:02,190 Ennek során, ha ténylegesen levelet állandót a kódot, 27 00:01:02,190 --> 00:01:05,630 ez néha a segítségével bűvös szám, ami valami 28 00:01:05,630 --> 00:01:08,030 mi általában szeretnénk arra, hogy elkerülje. 29 00:01:08,030 --> 00:01:12,830 >> Például, vessünk egy pillantást Az egyszerű funkciót itt. 30 00:01:12,830 --> 00:01:15,726 Nyilvánvalóan nincs adat típusok: C nevű kártyát vagy fedélzet. 31 00:01:15,726 --> 00:01:16,600 Tehát csak a medve velem. 32 00:01:16,600 --> 00:01:18,910 Ez egy kicsit pszeudokódja vegyesen itt. 33 00:01:18,910 --> 00:01:21,050 Ez egy olyan függvény is foglalkozni kártyát, hogy látszólag 34 00:01:21,050 --> 00:01:26,570 vesz egy pakli paraméternek, és a parancs, hogy nekem egy kártyát. 35 00:01:26,570 --> 00:01:30,990 >> És csinálok valamit itt, ahol én Van egy ciklus, ami fut 0-52, 36 00:01:30,990 --> 00:01:33,394 és én foglalkozik a kártyát. 37 00:01:33,394 --> 00:01:35,310 Nos, most már van egy varázsa szám itt, ugye. 38 00:01:35,310 --> 00:01:38,790 Látod, mi a bűvös szám? 39 00:01:38,790 --> 00:01:42,280 Vagy ami még fontosabb, mit hogy mi a probléma itt? 40 00:01:42,280 --> 00:01:44,310 Különösen akkor, ha ezt a csak egy függvény 41 00:01:44,310 --> 00:01:48,030 saját fájlt egy tartalmazó mappát 42 00:01:48,030 --> 00:01:49,970 egy csomó különböző fájlokat, amelyek mindegyike 43 00:01:49,970 --> 00:01:51,670 nem egy másik dolog, hogy egy pakli kártya. 44 00:01:51,670 --> 00:01:57,310 Lehet, hogy megkeveri, vagy foglalkozik a kezét öt lap helyett egy kártyát. 45 00:01:57,310 --> 00:01:59,420 >> Látod, amit a probléma lehet itt? 46 00:01:59,420 --> 00:02:03,220 Látod a bűvös szám Már fecskendeznek a kódot? 47 00:02:03,220 --> 00:02:04,390 Ez 52, jobbra. 48 00:02:04,390 --> 00:02:06,440 >> Mint, ösztönösen azt bizonyára tudják, az OK gombra. 49 00:02:06,440 --> 00:02:09,740 Mint egy normál pakli kártyák tartalmaz 52 lap. 50 00:02:09,740 --> 00:02:12,570 De a programunk, ez csak fajta lebeg ott. 51 00:02:12,570 --> 00:02:15,280 Olyan ez, mint hirtelen van egy 52. 52 00:02:15,280 --> 00:02:18,290 >> Ennek egyik módja, hogy megoldja ezt probléma az, hogy ezt. 53 00:02:18,290 --> 00:02:22,724 Mi nagyon nyíltan most kiabálták a fedélzeten méretű, mint 52. 54 00:02:22,724 --> 00:02:25,390 Ez ad neki egy kis intuitívabb jelenti, hogy ha a for ciklus 55 00:02:25,390 --> 00:02:28,650 később mondunk, i kevesebb, mint fedélzet méret. 56 00:02:28,650 --> 00:02:32,666 Csak úgy tűnik, jobb, mint mondta 52. 57 00:02:32,666 --> 00:02:34,290 Most ez valóban megoldja a problémát. 58 00:02:34,290 --> 00:02:38,460 Ez nem ad valamilyen szimbolikus vagyis az állandó. 59 00:02:38,460 --> 00:02:40,820 De ez nem ilyen ténylegesen vezessenek be egy másik probléma 60 00:02:40,820 --> 00:02:43,770 hogy lehet, hogy nem azonnal nyilvánvaló. 61 00:02:43,770 --> 00:02:45,859 Még ha ez a változó nyilvánítják globally-- 62 00:02:45,859 --> 00:02:47,650 emlékszel, mi azt jelenti, ha kijelentjük 63 00:02:47,650 --> 00:02:50,500 egy változó világban versus helyben? 64 00:02:50,500 --> 00:02:53,340 Még ha kijelentjük változó globálisan, mi van, ha van 65 00:02:53,340 --> 00:02:55,500 Egy másik funkció a csomag a funkciók 66 00:02:55,500 --> 00:02:59,750 hogy foglalkoznak-kártya manipuláció hogy véletlenül megváltoztatja a fedélzet mérete, 67 00:02:59,750 --> 00:03:02,727 vagy növeli azt 1 vagy csökkenti az 1. 68 00:03:02,727 --> 00:03:04,060 Hogy is varázslat baj, ugye? 69 00:03:04,060 --> 00:03:08,261 Különösen, ha van dolgunk egy sor Képeslapok, ahol csoszog a teljes fedélzet 70 00:03:08,261 --> 00:03:08,760 van szükség. 71 00:03:08,760 --> 00:03:12,804 Ha fedélzet mérete csökken 1, például a 51, 72 00:03:12,804 --> 00:03:14,970 akkor nem is igazából csoszogó az összes kártya esetleg. 73 00:03:14,970 --> 00:03:16,500 Elmegyünk az egyiket ki. 74 00:03:16,500 --> 00:03:21,680 És ez az érték úgy is lehet jósolta, vagy kihasználva a rossz színész. 75 00:03:21,680 --> 00:03:24,920 >> C nyújt egy úgynevezett előfeldolgozó direktíva, amely 76 00:03:24,920 --> 00:03:27,764 is hívják makró szimbolikus állandók. 77 00:03:27,764 --> 00:03:30,180 És valóban, ezt már láttam egy előfeldolgozó direktíva, 78 00:03:30,180 --> 00:03:32,916 akkor is, ha még nem hallottam hívják azt a #include. 79 00:03:32,916 --> 00:03:37,150 Ez egy újabb példa a makró vagy preprocessor irányelvet. 80 00:03:37,150 --> 00:03:41,290 >> A módja annak, hogy a szimbolikus állandók, vagy névadás állandó 81 00:03:41,290 --> 00:03:43,740 úgy, hogy több vagyis, a következő. 82 00:03:43,740 --> 00:03:47,030 #define, név, csere. 83 00:03:47,030 --> 00:03:49,140 Az igazán fontos félre Itt nagyon gyors. 84 00:03:49,140 --> 00:03:54,180 Ne tegyen egy pontosvessző Vége a #define. 85 00:03:54,180 --> 00:03:57,310 Szóval ez #define, keresztnév, csere. 86 00:03:57,310 --> 00:03:59,540 >> Amikor a program összeállítása, hogy valójában mi történik 87 00:03:59,540 --> 00:04:01,740 a fordító, ha megy hogy menjen át a kódot 88 00:04:01,740 --> 00:04:06,770 és minden példányát helyettesíti a "név", amit ki 89 00:04:06,770 --> 00:04:08,860 tedd a helyére. 90 00:04:08,860 --> 00:04:13,060 Analóg módon, ha #include egyfajta A hasonló másolás és beillesztés, 91 00:04:13,060 --> 00:04:15,700 majd #define egyfajta hasonló megtalálni és cserélje, 92 00:04:15,700 --> 00:04:19,180 ha valaha is használt, hogy jellemző a szövegszerkesztő programot, például. 93 00:04:19,180 --> 00:04:26,345 >> Így például, ha I #define PI 3.14159265, 94 00:04:26,345 --> 00:04:28,720 ha jobban matematikailag hajlik, és hirtelen 95 00:04:28,720 --> 00:04:31,640 lásd 3.14159265 repülő körül a kódot, 96 00:04:31,640 --> 00:04:33,517 akkor valószínűleg tudja, hogy beszél pi. 97 00:04:33,517 --> 00:04:35,850 De talán, hogy ez egy kicsit több szimbolikus jelentése van. 98 00:04:35,850 --> 00:04:39,850 És tudjuk helyett mondjuk #define pi, mint falat számok 99 00:04:39,850 --> 00:04:42,110 hogy nem fogom tartani olvasás újra és újra. 100 00:04:42,110 --> 00:04:45,560 >> És mi fog történni majd összeállítja az idő, amikor a program 101 00:04:45,560 --> 00:04:48,530 összeállított, az első dolog, fog történni fog átmenni 102 00:04:48,530 --> 00:04:51,520 és ez váltja minden alkalommal úgy látja, nagybetűvel, a tőke I., 103 00:04:51,520 --> 00:04:55,610 ez lesz szó helyébe 3.14 és így tovább, úgy, hogy 104 00:04:55,610 --> 00:04:58,090 Nem kell, hogy írja meg minden időben, miközben a program még mindig csak 105 00:04:58,090 --> 00:05:00,631 az a szolgáltatás, amit számíthat, mert dolgozik 106 00:05:00,631 --> 00:05:05,090 A manipulálni, megszorozzuk, elosztják, bármi is legyen az pi. 107 00:05:05,090 --> 00:05:08,230 >> Ön nem korlátozódik erre helyettesítés csak számok. 108 00:05:08,230 --> 00:05:12,279 Például, tudtam #define Természetesen, mint a húr CS50. 109 00:05:12,279 --> 00:05:14,070 Ebben az esetben, amikor a program összeállítása, 110 00:05:14,070 --> 00:05:16,236 #define megy át a kódot, cserélje minden alkalommal 111 00:05:16,236 --> 00:05:19,900 úgy látja, "természetesen" a húr CS50. 112 00:05:19,900 --> 00:05:21,720 >> Észre fogod venni, itt azt is, hogy gyakran 113 00:05:21,720 --> 00:05:26,090 #define az én meghatározott szimbolikus állandók, hogy úgy mondjam, 114 00:05:26,090 --> 00:05:28,130 Mindig minden sapkák. 115 00:05:28,130 --> 00:05:28,960 Ez egy ilyen egyezmény. 116 00:05:28,960 --> 00:05:30,170 Ez nem szükséges. 117 00:05:30,170 --> 00:05:33,900 Az ok általában az emberek használni nagybetűkké ha ők #defining 118 00:05:33,900 --> 00:05:37,590 csak hogy igazán világos, hogy ennek egyes elemeit kódomat 119 00:05:37,590 --> 00:05:38,820 egy meghatározott állandó. 120 00:05:38,820 --> 00:05:43,730 Ha ez kisbetűs, akkor lehetséges, hogy összekeverhető lenne egy változtatható. 121 00:05:43,730 --> 00:05:46,120 És valószínűleg, nem egy jó dolog. 122 00:05:46,120 --> 00:05:48,910 >> Tehát ebben a konkrét megoldás sokkal jobb 123 00:05:48,910 --> 00:05:50,550 mint akár a korábbiak. 124 00:05:50,550 --> 00:05:59,950 Ha először #define fedélzet mérete 52, majd Most az általam használt 52, vagy a fedélzet mérete itt, 125 00:05:59,950 --> 00:06:01,850 sokkal intuitívabb és sokkal biztonságosabb. 126 00:06:01,850 --> 00:06:03,280 Nem lehet manipulálni állandó. 127 00:06:03,280 --> 00:06:05,259 Nem lehet azt mondani 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 Az nem fog átalakítani, hogy 53. 129 00:06:06,800 --> 00:06:09,390 Nem tudod megváltoztatni 52 valamire. 130 00:06:09,390 --> 00:06:12,470 >> Meg lehet változtatni a változó amelynek az értéke 52, 131 00:06:12,470 --> 00:06:14,870 ez volt az első fix miénk volt. 132 00:06:14,870 --> 00:06:17,000 És lehetne növelni hogy a változó a 53. 133 00:06:17,000 --> 00:06:21,100 De nem mondhatod, 52 plus plus és Van, hogy hirtelen alakulnak az 52 53. 134 00:06:21,100 --> 00:06:23,350 52 mindig 52. 135 00:06:23,350 --> 00:06:28,860 És így nem lehet véletlenül megváltoztat fedélzet mérete itt manipulálásával úgy, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Egy másik jó oldala hatása ennek ellenére is 138 00:06:32,390 --> 00:06:38,310 hogy tisztában van azzal, hogy nem Minden országban szerte a világon 139 00:06:38,310 --> 00:06:40,690 használjon egy pakli kártya mérete 52? 140 00:06:40,690 --> 00:06:45,630 Például, ez tényleg gyakori Németország használni egy pakli mérete 32, 141 00:06:45,630 --> 00:06:48,020 ahol eltávolítják néhány Az alacsonyabb értéket kártyák. 142 00:06:48,020 --> 00:06:50,960 És ebben az esetben, azt akarta port lakosztályomba 143 00:06:50,960 --> 00:06:55,390 funkciót, amely foglalkozik kártya manipuláció Németországba. 144 00:06:55,390 --> 00:06:59,440 Tudtam az első fokon azt kimutatta, hogy menjen, és cserélje 145 00:06:59,440 --> 00:07:03,570 összes előfordulását 52 kódomat 32. 146 00:07:03,570 --> 00:07:07,940 >> De itt, ha én #define pakli méret 32 legtetején a kódomat, 147 00:07:07,940 --> 00:07:11,730 ha kell változtatni, tudom csak megy és a változás, hogy az egyik dolog. 148 00:07:11,730 --> 00:07:15,010 Újrafordítani a kódomat, és az összes Hirtelen úgy keresztül terjed. 149 00:07:15,010 --> 00:07:18,850 Sőt, meg tudjuk változtatni a fedélzet mérete bármilyen értéket akarunk. 150 00:07:18,850 --> 00:07:22,500 >> Tudok Önt érdeklő egy játék a fedélzeten pickup? 151 00:07:22,500 --> 00:07:23,430 >> Én Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 És ez CS50. 153 00:07:25,840 --> 00:07:27,772