1 00:00:00,000 --> 00:00:02,350 >> [Glazbom] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 Doug LLOYD: U redu. 4 00:00:06,360 --> 00:00:07,770 Vrsta čudno temi, zar ne? 5 00:00:07,770 --> 00:00:09,050 Magic brojevi. 6 00:00:09,050 --> 00:00:12,012 Što Srna je mislio kad je govori o magijskim brojevima? 7 00:00:12,012 --> 00:00:14,220 Pa, neki od programa da smo zapisano u CS50 8 00:00:14,220 --> 00:00:16,660 Do sada su imali neki čudan Brojevi vrsta bačen u njih. 9 00:00:16,660 --> 00:00:19,680 Možda iz razloga što mi ne znamo potpuno razumijem sada. 10 00:00:19,680 --> 00:00:23,950 Na primjer, u Mario problem, kapom visinu piramide na 23. 11 00:00:23,950 --> 00:00:26,880 Mi vam izričito rekao ne može ići više od 23. 12 00:00:26,880 --> 00:00:28,702 >> Ali što znači 23? 13 00:00:28,702 --> 00:00:30,410 Pa, ako ste pročitali spec pažljivo, te 14 00:00:30,410 --> 00:00:32,493 Možda ste vidjeli da je Razlog zbog kojeg smo ga kapom na 23 15 00:00:32,493 --> 00:00:36,160 zato je standardne visine od prozora terminala je 24. 16 00:00:36,160 --> 00:00:38,860 I tako, ako imamo Piramida biti jači od toga, 17 00:00:38,860 --> 00:00:41,290 to može učiniti čudan stvar gdje se radi isključili zaslon. 18 00:00:41,290 --> 00:00:45,140 I znaš, što se to znači u kontekstu, zar ne? 19 00:00:45,140 --> 00:00:48,880 >> Je značenje 23 odmah očiti nekome tko gleda svoj program 20 00:00:48,880 --> 00:00:51,550 a možda ima drugačiji Veličina terminala prozor? 21 00:00:51,550 --> 00:00:52,330 Vjerojatno ne. 22 00:00:52,330 --> 00:00:53,080 Čini se, u redu. 23 00:00:53,080 --> 00:00:55,005 Pa, zašto je samo manje od 23? 24 00:00:55,005 --> 00:00:56,880 U principu, to je vrsta od loše navike zapravo 25 00:00:56,880 --> 00:00:58,940 pisati konstante u kodu. 26 00:00:58,940 --> 00:01:02,190 Na taj način, kada se zapravo učiniti napisati konstantu u kodu, 27 00:01:02,190 --> 00:01:05,630 ponekad se naziva i pomoću Magic Numbers, što je nešto 28 00:01:05,630 --> 00:01:08,030 mi općenito želimo pokušati izbjeći. 29 00:01:08,030 --> 00:01:12,830 >> Na primjer, neka je pogledati U ovom jednostavnom funkcijom ovdje. 30 00:01:12,830 --> 00:01:15,726 Očito nema podataka upišite C zove karticu ili palube. 31 00:01:15,726 --> 00:01:16,600 Dakle, samo nose sa sobom. 32 00:01:16,600 --> 00:01:18,910 To je malo pseudokod mješoviti ovdje. 33 00:01:18,910 --> 00:01:21,050 To je funkcija zove nositi karticu koja očito 34 00:01:21,050 --> 00:01:26,570 ima palubu kao svoj parametar, i izlaz će mi jedna kartica. 35 00:01:26,570 --> 00:01:30,990 >> I ja radim nešto ovdje gdje sam imaju petlju koja ide od 0 do 52, 36 00:01:30,990 --> 00:01:33,394 i ja nositi karticu. 37 00:01:33,394 --> 00:01:35,310 Pa, imamo magiju Broj ovdje, zar ne. 38 00:01:35,310 --> 00:01:38,790 Vidite li što je magija broj? 39 00:01:38,790 --> 00:01:42,280 Ili još važnije, zar ne vidim u čemu je problem ovdje? 40 00:01:42,280 --> 00:01:44,310 Osobito ako je to je samo jedna funkcija 41 00:01:44,310 --> 00:01:48,030 u vlastitoj datoteke na mapa koja sadrži 42 00:01:48,030 --> 00:01:49,970 hrpa različitih slika, od kojih je svaki 43 00:01:49,970 --> 00:01:51,670 ne još jedna stvar na špil karata. 44 00:01:51,670 --> 00:01:57,310 Možda ih je shuffles, ili se bavi ruku od pet kartica umjesto jednu karticu. 45 00:01:57,310 --> 00:01:59,420 >> Vidite li što se Problem bi mogao biti ovdje? 46 00:01:59,420 --> 00:02:03,220 Vidite li čarobnu broj Ja sam ubrizgava u kodu? 47 00:02:03,220 --> 00:02:04,390 To je 52, u pravu. 48 00:02:04,390 --> 00:02:06,440 >> Kao, intuitivno što vjerojatno znate, u redu. 49 00:02:06,440 --> 00:02:09,740 Kao standardnu ​​palube kartica sadrži 52 kartica. 50 00:02:09,740 --> 00:02:12,570 No, u našem programu, to je samo vrsta lebdenje okolo unutra. 51 00:02:12,570 --> 00:02:15,280 To je kao da odjednom postoji 52. 52 00:02:15,280 --> 00:02:18,290 >> Jedan od načina za rješavanje ovog Problem je da to učinite. 53 00:02:18,290 --> 00:02:22,724 Mi smo vrlo jasno sada doziva veličine palube kao 52. 54 00:02:22,724 --> 00:02:25,390 To mu daje malo više intuitivno što znači kad je u for petlji 55 00:02:25,390 --> 00:02:28,650 kasnije mi onda reći, manja od veličine palube. 56 00:02:28,650 --> 00:02:32,666 To samo izgleda bolje nego govori 52. 57 00:02:32,666 --> 00:02:34,290 Sada to zapravo ne riješi problem. 58 00:02:34,290 --> 00:02:38,460 To daje neke simboličke što znači da se na konstantu. 59 00:02:38,460 --> 00:02:40,820 No, to se vrsta zapravo uvesti još jedan problem 60 00:02:40,820 --> 00:02:43,770 da ne bi mogli biti vidljivi odmah. 61 00:02:43,770 --> 00:02:45,859 Čak i ako ta varijabla proglašeno globally-- 62 00:02:45,859 --> 00:02:47,650 Sjećate li se što je to znači kad izjavljujemo 63 00:02:47,650 --> 00:02:50,500 varijabla globalno odnosu na lokalnoj razini? 64 00:02:50,500 --> 00:02:53,340 Čak i ako smo proglasiti varijablu na globalnoj razini, što ako postoji 65 00:02:53,340 --> 00:02:55,500 još jedna funkcija u naš paket funkcija 66 00:02:55,500 --> 00:02:59,750 koje se bave manipulacije kartice da nehotice mijenja veličinu palube, 67 00:02:59,750 --> 00:03:02,727 ili ga povećava za 1 ili ga smanjuje za 1. 68 00:03:02,727 --> 00:03:04,060 To bi moglo značiti nevolje, zar ne? 69 00:03:04,060 --> 00:03:08,261 Pogotovo ako imamo posla sa skupa kartica gdje miješanje puni palube 70 00:03:08,261 --> 00:03:08,760 potreban. 71 00:03:08,760 --> 00:03:12,804 Ako je smanjena veličina sunčanje sa 1, na primjer, do 51, 72 00:03:12,804 --> 00:03:14,970 nismo zapravo miješanje sve karte eventualno. 73 00:03:14,970 --> 00:03:16,500 Odlazimo jednog od njih. 74 00:03:16,500 --> 00:03:21,680 I to vrijednost možda mogao biti predvidjeti ili iskorištava loše glumac. 75 00:03:21,680 --> 00:03:24,920 >> C daje ono što se naziva Preprocessoru direktiva, koja 76 00:03:24,920 --> 00:03:27,764 se također naziva makro za stvara simboličke konstante. 77 00:03:27,764 --> 00:03:30,180 A u stvari, već ste Vidio Preprocessor direktive, 78 00:03:30,180 --> 00:03:32,916 čak i ako niste čuli pozvao da se s #include. 79 00:03:32,916 --> 00:03:37,150 To je još jedan primjer makro ili Preprocessoru direktiva. 80 00:03:37,150 --> 00:03:41,290 >> Način stvoriti simboličke konstante, ili davanje naziv konstantna 81 00:03:41,290 --> 00:03:43,740 tako da ima više što znači, kako slijedi. 82 00:03:43,740 --> 00:03:47,030 #define, naziv, zamjena. 83 00:03:47,030 --> 00:03:49,140 Stvarno važna stranu Ovdje stvarno brzo. 84 00:03:49,140 --> 00:03:54,180 Nemojte staviti zarez na kraj svoje #defines. 85 00:03:54,180 --> 00:03:57,310 Dakle, to je #define, naziv, zamjena. 86 00:03:57,310 --> 00:03:59,540 >> Kada je vaš program sastavljen, što se zapravo događa 87 00:03:59,540 --> 00:04:01,740 je prevodilac, ako ide proći kroz kodu 88 00:04:01,740 --> 00:04:06,770 i zamijeniti svaku instancu riječ "ime" u što god 89 00:04:06,770 --> 00:04:08,860 staviti kao zamjenu. 90 00:04:08,860 --> 00:04:13,060 Analogno, ako #include je vrsta slična kopiranja i lijepljenja, 91 00:04:13,060 --> 00:04:15,700 onda #define je vrsta slično pronaći i zamijeniti, 92 00:04:15,700 --> 00:04:19,180 Ako ste ikada koristili tu značajku u Program za obradu teksta, npr. 93 00:04:19,180 --> 00:04:26,345 >> Tako na primjer, ako #define pi kao 3,14159265, 94 00:04:26,345 --> 00:04:28,720 ako si bolji matematički skloni i iznenada 95 00:04:28,720 --> 00:04:31,640 vidi 3,14159265 leti oko u kodu, 96 00:04:31,640 --> 00:04:33,517 vjerojatno znate da pričaju pi. 97 00:04:33,517 --> 00:04:35,850 Ali možda bismo ga može dati malo više simboličko značenje. 98 00:04:35,850 --> 00:04:39,850 I umjesto da se #define reći pi kao da zalogaj brojeva 99 00:04:39,850 --> 00:04:42,110 da neću zadržati čitajući iznova i iznova. 100 00:04:42,110 --> 00:04:45,560 >> A što će se dogoditi onda sastaviti vrijeme kad program 101 00:04:45,560 --> 00:04:48,530 sastavio, prva stvar koja će se dogoditi je da će proći kroz 102 00:04:48,530 --> 00:04:51,520 i to će zamijeniti svaki put vidi kapital P, kapital I, 103 00:04:51,520 --> 00:04:55,610 to doslovno ćete ga zamijeniti s 3.14 i tako dalje, tako da 104 00:04:55,610 --> 00:04:58,090 ne morate upisati se svaki Vrijeme dok vaš program i dalje 105 00:04:58,090 --> 00:05:00,631 ima funkcionalnost koja vam očekivati, jer radite 106 00:05:00,631 --> 00:05:05,090 s manipulira, množenjem, dijeljenjem, bez obzira na to je po pi. 107 00:05:05,090 --> 00:05:08,230 >> Ne ograničavaju to Zamjena samo za brojeve. 108 00:05:08,230 --> 00:05:12,279 Na primjer, mogao sam #define Naravno kao gudački CS50. 109 00:05:12,279 --> 00:05:14,070 U tom slučaju, kada je Program je sastavljen, 110 00:05:14,070 --> 00:05:16,236 #define će proći kroz broj, zamijenite svaki put 111 00:05:16,236 --> 00:05:19,900 vidi "tečaj" uz gudački CS50. 112 00:05:19,900 --> 00:05:21,720 >> Primijetit ćete ovdje i da sam često 113 00:05:21,720 --> 00:05:26,090 #define sve moje definirana simbolična konstante, da se tako izrazim, 114 00:05:26,090 --> 00:05:28,130 su uvijek u svim kape. 115 00:05:28,130 --> 00:05:28,960 To je konvencija. 116 00:05:28,960 --> 00:05:30,170 To nije potrebno. 117 00:05:30,170 --> 00:05:33,900 Razlog općenito ljudi će koristiti svi glavni gradovi kada oni #defining 118 00:05:33,900 --> 00:05:37,590 je samo da bi to stvarno jasno da ovaj element moj broj 119 00:05:37,590 --> 00:05:38,820 je definirana konstantna. 120 00:05:38,820 --> 00:05:43,730 Ako je mala, moguće je da to bi moglo biti zbunjen sa varijablom. 121 00:05:43,730 --> 00:05:46,120 I to je vjerojatno nije dobra stvar za učiniti. 122 00:05:46,120 --> 00:05:48,910 >> Dakle, ovaj Otopina je puno bolje 123 00:05:48,910 --> 00:05:50,550 nego bilo koji od prethodnih. 124 00:05:50,550 --> 00:05:59,950 Ako sam prvi #define veličina palubi 52, a zatim Sada mi je korištenje 52 ili veličini palubi ovdje, 125 00:05:59,950 --> 00:06:01,850 je puno više intuitivan i puno sigurnije. 126 00:06:01,850 --> 00:06:03,280 Ne možete manipulirati konstantu. 127 00:06:03,280 --> 00:06:05,259 Ne može se reći 52 plus plus. 128 00:06:05,259 --> 00:06:06,800 To neće pretvoriti ga u 53. 129 00:06:06,800 --> 00:06:09,390 Ne možeš mijenjati 52 do nečega. 130 00:06:09,390 --> 00:06:12,470 >> Možete promijeniti varijablu čija je vrijednost 52, 131 00:06:12,470 --> 00:06:14,870 koji je prvi popravak smo imali prije. 132 00:06:14,870 --> 00:06:17,000 A ti bi mogao povećati da varijabla do 53. 133 00:06:17,000 --> 00:06:21,100 Ali ne mogu reći 52 plus plus i ima da se iznenada pretvoriti u 52 53. 134 00:06:21,100 --> 00:06:23,350 52 je uvijek 52. 135 00:06:23,350 --> 00:06:28,860 I tako da ne mogu nenamjerno promijeniti Veličina palube ovdje da manipulira, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Još jedna dobra strana Učinak ovog, iako je 138 00:06:32,390 --> 00:06:38,310 da ste svjesni da ne sve zemlje diljem svijeta 139 00:06:38,310 --> 00:06:40,690 koristiti špil karata veličine 52? 140 00:06:40,690 --> 00:06:45,630 Na primjer, to je stvarno čest u Njemačka koristiti veličinu palubi 32, 141 00:06:45,630 --> 00:06:48,020 gdje skinuti neke nižih vrijednosti kartica. 142 00:06:48,020 --> 00:06:50,960 I u ovom slučaju, ja htjela luke moj suite 143 00:06:50,960 --> 00:06:55,390 funkcija koje se bave kartice manipulacija u Njemačku. 144 00:06:55,390 --> 00:06:59,440 Sam mogao u prvom stupnju smo pokazali, moraju ići i zamijeniti 145 00:06:59,440 --> 00:07:03,570 svi slučajevi 52 u mom kodu s 32. 146 00:07:03,570 --> 00:07:07,940 >> Ali ovdje, ako sam #define veličina sunčanje kao 32 na samom vrhu moje koda, 147 00:07:07,940 --> 00:07:11,730 ako trebam mijenjati, mogu samo idite i promijeniti tu jednu stvar. 148 00:07:11,730 --> 00:07:15,010 Rekompilirati moj broj, i svi odjednom se širi putem. 149 00:07:15,010 --> 00:07:18,850 Zapravo, možemo promijeniti palube Veličina na bilo koju vrijednost želimo. 150 00:07:18,850 --> 00:07:22,500 >> Mogu li vas zainteresirati u Igra veličine palube kurva? 151 00:07:22,500 --> 00:07:23,430 >> Ja sam Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 A to je CS50. 153 00:07:25,840 --> 00:07:27,772