1 00:00:00,000 --> 00:00:02,350 >> [MUZIKO Ludante] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Bone. 4 00:00:06,360 --> 00:00:07,770 Speco de stranga temo, ĉu ne? 5 00:00:07,770 --> 00:00:09,050 Magia nombroj. 6 00:00:09,050 --> 00:00:12,012 Kio cervino li signifas kiam li estas parolante pri magiaj numeroj? 7 00:00:12,012 --> 00:00:14,220 Nu, kelkaj el la programoj ke ni skribis en CS50 8 00:00:14,220 --> 00:00:16,660 ĝis nun havis kelkajn strangajn nombroj speco de ĵetita en ili. 9 00:00:16,660 --> 00:00:19,680 Eble pro kialoj ni ne tute kompreni ĝuste nun. 10 00:00:19,680 --> 00:00:23,950 Ekzemple, en la Mario problemo, ni haltigataj la alteco de la piramido ĉe 23. 11 00:00:23,950 --> 00:00:26,880 Ni eksplicite diris vin ne iru pli alten ol 23. 12 00:00:26,880 --> 00:00:28,702 >> Sed kion signifas 23 signifas? 13 00:00:28,702 --> 00:00:30,410 Nu, se vi legas la Spec zorgeme, vi 14 00:00:30,410 --> 00:00:32,493 eble vidis ke la kialo ni haltigataj ĝin ĉe 23 15 00:00:32,493 --> 00:00:36,160 Estas ĉar la norma alteco de terminalprograo estas 24. 16 00:00:36,160 --> 00:00:38,860 Kaj do se ni havas la piramido esti pli alta ol tiu, 17 00:00:38,860 --> 00:00:41,290 ĝi povus fari ĉi strangaĵon kie kuras for la ekrano. 18 00:00:41,290 --> 00:00:45,140 Kaj vi scias, kion faras signifas en kunteksto, ĉu ne? 19 00:00:45,140 --> 00:00:48,880 >> Estas la signifo de 23 tuj preterlasas al iu kiu rigardas vian programon 20 00:00:48,880 --> 00:00:51,550 kaj eble havas malsaman grandeco terminalfenestro? 21 00:00:51,550 --> 00:00:52,330 Probable ne. 22 00:00:52,330 --> 00:00:53,080 Ŝajnas kiel, OK. 23 00:00:53,080 --> 00:00:55,005 Nu, kial estas ĝi nur malpli ol 23? 24 00:00:55,005 --> 00:00:56,880 Ĝenerale, ĝi estas speco de malbona kutimo reale 25 00:00:56,880 --> 00:00:58,940 skribi konstantoj en vian kodon. 26 00:00:58,940 --> 00:01:02,190 En fari tion, kiam vi reale fari Skribi konstanta en via kodo, 27 00:01:02,190 --> 00:01:05,630 ĝi estas iam referis al kiel uzanta magio nombroj, kiu estas io 28 00:01:05,630 --> 00:01:08,030 ni ĝenerale volas klopodi eviti. 29 00:01:08,030 --> 00:01:12,830 >> Ekzemple, ni rigardu ĉe tiu simpla funkcio tie. 30 00:01:12,830 --> 00:01:15,726 Evidente ne estas datumoj tipo en C nomita karto aŭ ferdeko. 31 00:01:15,726 --> 00:01:16,600 Do simple toleru min. 32 00:01:16,600 --> 00:01:18,910 Estas iomete da _pseudocode_ miksita tie. 33 00:01:18,910 --> 00:01:21,050 Tiu estas funkcio nomita trakti karto kiu ŝajne 34 00:01:21,050 --> 00:01:26,570 prenas ferdeko kiel ĝia parametro, kaj volo eligo min sola karto. 35 00:01:26,570 --> 00:01:30,990 >> Kaj mi faras ion tie, kie mi havas buklo kiu kuras de 0 al 52, 36 00:01:30,990 --> 00:01:33,394 kaj mi trakti karto. 37 00:01:33,394 --> 00:01:35,310 Nu, ni hvas magio numeron tien, dekstren. 38 00:01:35,310 --> 00:01:38,790 Ĉu vi vidas kion la magia nombro estas? 39 00:01:38,790 --> 00:01:42,280 Aŭ pli grave, ĉu vi vidi kion la problemo estas tie? 40 00:01:42,280 --> 00:01:44,310 Aparte se ĉi estas nur unu funkcio 41 00:01:44,310 --> 00:01:48,030 en ĝia propra dosiero en dosierujo kiu enhavas 42 00:01:48,030 --> 00:01:49,970 faskon de malsamaj dosierojn, ĉiu el kiuj 43 00:01:49,970 --> 00:01:51,670 faras alian aferon por ludkartaro de kartoj. 44 00:01:51,670 --> 00:01:57,310 Eble ludkartaro ilin, aŭ traktas Mano de kvin kartoj anstataŭ sola karto. 45 00:01:57,310 --> 00:01:59,420 >> Ĉu vi vidas kion la problemo povus esti tie? 46 00:01:59,420 --> 00:02:03,220 Ĉu vi vidas la magia nombro Mi injektita en la kodo? 47 00:02:03,220 --> 00:02:04,390 Estas 52, dekstre. 48 00:02:04,390 --> 00:02:06,440 >> Kiel, intuicie vi probable scias, OK. 49 00:02:06,440 --> 00:02:09,740 Kiel norma ferdeko de kartoj enhavas 52 kartojn. 50 00:02:09,740 --> 00:02:12,570 Sed en nia programo, estas nur ia ŝvebantan en tie. 51 00:02:12,570 --> 00:02:15,280 Estas kiel subite ekzistas 52. 52 00:02:15,280 --> 00:02:18,290 >> Unu maniero solvi tiun problemo estas fari tion. 53 00:02:18,290 --> 00:02:22,724 Ni estas tre eksplicite nun vokante la ferdeko grandeco kiel 52. 54 00:02:22,724 --> 00:02:25,390 Ĝi donas iom pli intuicia Signifanta kiam en la por buklo 55 00:02:25,390 --> 00:02:28,650 poste ni diru, i estas malpli ol ferdeko grandeco. 56 00:02:28,650 --> 00:02:32,666 Ĝi nur ŝajnas bona ol jene 52. 57 00:02:32,666 --> 00:02:34,290 Nun ĉi faras efektive riparas la problemon. 58 00:02:34,290 --> 00:02:38,460 Ĝi donas iun simbolan signifon al la konstanto. 59 00:02:38,460 --> 00:02:40,820 Sed ĝi faras specon de reale enkonduki alian problemon 60 00:02:40,820 --> 00:02:43,770 ke ne povus esti tuj evidenta. 61 00:02:43,770 --> 00:02:45,859 Eĉ se tiu variablo estas deklarita globally-- 62 00:02:45,859 --> 00:02:47,650 ĉu vi memoras kion ĝi signifas kiam ni deklaras 63 00:02:47,650 --> 00:02:50,500 ŝanĝiĝema tutmonde kontre loke? 64 00:02:50,500 --> 00:02:53,340 Eĉ se ni deklari variablon tutmonde, kio se estas 65 00:02:53,340 --> 00:02:55,500 alian funkcion en nia suite de funkcioj 66 00:02:55,500 --> 00:02:59,750 ke interkonsento kun karto manipulado ke distrite ŝanĝas ferdeko grandeco, 67 00:02:59,750 --> 00:03:02,727 aŭ ĝi pliigas ĝin 1 aŭ malpliigas ŝin por 1. 68 00:03:02,727 --> 00:03:04,060 Tio povus literumi problemojn, ĉu ne? 69 00:03:04,060 --> 00:03:08,261 Speciale se ni pritraktas aron de kartoj kie barajando la plenan ferdekon 70 00:03:08,261 --> 00:03:08,760 estas bezonata. 71 00:03:08,760 --> 00:03:12,804 Se ferdeko grandeco estas malpliigita por 1, ekzemple, al 51, 72 00:03:12,804 --> 00:03:14,970 ni fakte ne barajar ĉiuj kartoj eble. 73 00:03:14,970 --> 00:03:16,500 Ni lasas unu el ili ekstere. 74 00:03:16,500 --> 00:03:21,680 Kaj ke valoro povus eble esti antaŭdiris aŭ ekspluatita por malbona aktoro. 75 00:03:21,680 --> 00:03:24,920 >> C disponigas kio nomiĝas antaŭtraktilo direktivo kiu 76 00:03:24,920 --> 00:03:27,764 estas ankaŭ nomata makroo por krei simbolajn konstantoj. 77 00:03:27,764 --> 00:03:30,180 Kaj fakte, vi jam vidita antaŭtraktilo direktivo, 78 00:03:30,180 --> 00:03:32,916 eĉ se vi ne auxdis vokis ke kun #include. 79 00:03:32,916 --> 00:03:37,150 Ĝi estas alia ekzemplo de makroo aŭ antaŭtraktilo direktivo. 80 00:03:37,150 --> 00:03:41,290 >> La maniero krei simbolaj konstantoj, aŭ donante nomo al konstanta 81 00:03:41,290 --> 00:03:43,740 tiel ke ĝi havas pli Signifanta, estas kiel sekvas. 82 00:03:43,740 --> 00:03:47,030 #define, nomo, anstataŭaĵo. 83 00:03:47,030 --> 00:03:49,140 Vere grava flanken tie vere rapida. 84 00:03:49,140 --> 00:03:54,180 Ne metu punktokomo ĉe la fino de via #defines. 85 00:03:54,180 --> 00:03:57,310 Do estas #define, nomo, anstataŭaĵo. 86 00:03:57,310 --> 00:03:59,540 >> Kiam via programo estas kompilita, kio vere okazas 87 00:03:59,540 --> 00:04:01,740 estas la kompililo se irante iri tra via kodo 88 00:04:01,740 --> 00:04:06,770 kaj anstataŭi ĉiu petskribo de la vorto "nomo" kun kiom vi 89 00:04:06,770 --> 00:04:08,860 metis kiel anstataŭaĵo. 90 00:04:08,860 --> 00:04:13,060 Analoge, se #include estas speco de simila al kopii kaj bati, 91 00:04:13,060 --> 00:04:15,700 tiam #define estas ia simila al trovi kaj anstataŭigi, 92 00:04:15,700 --> 00:04:19,180 se vi iam uzis tiun karakterizaĵon en tekstoprilaborado programo, ekzemple. 93 00:04:19,180 --> 00:04:26,345 >> Do ekzemple, se mi #define pi kiel 3.14159265, 94 00:04:26,345 --> 00:04:28,720 se vi estas bona matematike klinita kaj vi subite 95 00:04:28,720 --> 00:04:31,640 vidi 3.14159265 flugado ĉirkaŭe en via kodo, 96 00:04:31,640 --> 00:04:33,517 Vi verŝajne konas ĝin parolas pri pi. 97 00:04:33,517 --> 00:04:35,850 Sed eble ni povas doni al ĝi iom pli simbolan signifon. 98 00:04:35,850 --> 00:04:39,850 Kaj ni povas anstataŭe diri #define pi kiel tiu buŝplenon de nombroj 99 00:04:39,850 --> 00:04:42,110 ke mi ne tuj teni legi super kaj super. 100 00:04:42,110 --> 00:04:45,560 >> Kaj kio okazos poste ĉe kompili tempo estas kiam la programo estas 101 00:04:45,560 --> 00:04:48,530 kompilita, la unua afero, kiun okazos estas ĝi trairos 102 00:04:48,530 --> 00:04:51,520 kaj ĝi anstataŭos ĉiufoje vidas ĉefurbo P, majuskla, 103 00:04:51,520 --> 00:04:55,610 gxi devos laŭvorte anstataŭigi ĝin per 3.14 kaj tiel plu, por ke vi 104 00:04:55,610 --> 00:04:58,090 ne devas tajpi ĝin ĉiufoje tempo dum via programo ankoraŭ 105 00:04:58,090 --> 00:05:00,631 havas la funcionalidad kiu vi atendi, ĉar vi laboras 106 00:05:00,631 --> 00:05:05,090 kun manipulado, multiplikante, dividadon, kion ajn ĝi estas de pi. 107 00:05:05,090 --> 00:05:08,230 >> Vi ne estas limigita al tiu anstataŭo por nombroj nur. 108 00:05:08,230 --> 00:05:12,279 Ekzemple, mi povus #define kurso kiel la kordo CS50. 109 00:05:12,279 --> 00:05:14,070 En tiu kazo, kiam la programo estas kompilita, 110 00:05:14,070 --> 00:05:16,236 #define trairos la kodo anstataŭigenda ĉiufoje 111 00:05:16,236 --> 00:05:19,900 ĝi vidas "kurson" kun la kordo CS50. 112 00:05:19,900 --> 00:05:21,720 >> Vi rimarkos ĉi tie ankaŭ ke mi ofte 113 00:05:21,720 --> 00:05:26,090 #define ĉiuj miaj difinita simbola konstantoj, por tiel diri, 114 00:05:26,090 --> 00:05:28,130 ĉiam en ĉiuj ĉapoj. 115 00:05:28,130 --> 00:05:28,960 Ĝi estas konvencio. 116 00:05:28,960 --> 00:05:30,170 Ĝi ne estas bezonata. 117 00:05:30,170 --> 00:05:33,900 La kialo ĝenerale homoj uzos ĉiuj ĉefurboj kiam ili estas #defining 118 00:05:33,900 --> 00:05:37,590 Estas nur por igi ĝin vere klara ke tiu aparta elemento de mia kodo 119 00:05:37,590 --> 00:05:38,820 estas difinita konstanto. 120 00:05:38,820 --> 00:05:43,730 Se estis minuskla, eblas ke ĝi povus esti konfuzita kun ŝanĝiĝema. 121 00:05:43,730 --> 00:05:46,120 Kaj tio estas probable ne estas bona afero por fari. 122 00:05:46,120 --> 00:05:48,910 >> Do tiu aparta solvo estas multe pli bona 123 00:05:48,910 --> 00:05:50,550 ol ĉiu el ambaŭ de la antaŭaj. 124 00:05:50,550 --> 00:05:59,950 Se mi unue #define ferdeko grandeco 52, tiam nun mia uzo de 52, aŭ ferdeko grandecon tie ĉi, 125 00:05:59,950 --> 00:06:01,850 estas multe pli intuitivo kaj multe pli sekura. 126 00:06:01,850 --> 00:06:03,280 Vi ne povas manipuli konstanta. 127 00:06:03,280 --> 00:06:05,259 Vi ne povas diri 52 plus alpago. 128 00:06:05,259 --> 00:06:06,800 Tio ne tuj konverti ĝin al 53. 129 00:06:06,800 --> 00:06:09,390 Vi ne povas ŝanĝi 52 al io. 130 00:06:09,390 --> 00:06:12,470 >> Vi povas ŝanĝi variablon kies valoro estas 52, 131 00:06:12,470 --> 00:06:14,870 kiu estis la unua fix ni havis antaŭe. 132 00:06:14,870 --> 00:06:17,000 Kaj vi povus pliigi ke variablo al 53. 133 00:06:17,000 --> 00:06:21,100 Sed vi ne povas diri 52 plus plus kaj havas ke subite turnas 52 en 53. 134 00:06:21,100 --> 00:06:23,350 52 estas ĉiam 52. 135 00:06:23,350 --> 00:06:28,860 Kaj tial vi ne povas preterintence ŝanĝi ferdeko grandeco tie manipulante ĝin, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Alia bona flanko efiko de tiu kvankam estas 138 00:06:32,390 --> 00:06:38,310 ke vi konscias ke ne ĉiuj landoj ĉirkaŭ la mondo 139 00:06:38,310 --> 00:06:40,690 Uzi ludkartaro de grandeco 52? 140 00:06:40,690 --> 00:06:45,630 Ekzemple, ĝi estas vere komuna en Germanio uzi ferdeko grandeco de 32, 141 00:06:45,630 --> 00:06:48,020 kie forstreku iuj de la malsupra valoro kartoj. 142 00:06:48,020 --> 00:06:50,960 Kaj en ĉi tiu kazo, mi volis havenon mia suite 143 00:06:50,960 --> 00:06:55,390 de funkcioj kiuj traktas karton manipulado al Germanio. 144 00:06:55,390 --> 00:06:59,440 Mi povis en la unua petskribo nin montris, devi iri kaj anstataŭigi 145 00:06:59,440 --> 00:07:03,570 ĉiuj okazoj de 52 en mia kodo kun 32. 146 00:07:03,570 --> 00:07:07,940 >> Sed ĉi tie, se mi #define ferdeko grandeco kiel 32 ĉe la plejsupro de mia kodo, 147 00:07:07,940 --> 00:07:11,730 se mi devas ŝanĝi ŝin, mi povas simple iri kaj ŝanĝi tiun unu aferon. 148 00:07:11,730 --> 00:07:15,010 Rekompili mian kodon, kaj ĉiuj Subite ĝi propagas tra. 149 00:07:15,010 --> 00:07:18,850 Fakte, ni povas ŝanĝi ferdeko grandeco por ajna valoro ni volas. 150 00:07:18,850 --> 00:07:22,500 >> Ĉu mi interesos vin en ludo de ferdeko grandeco pickup? 151 00:07:22,500 --> 00:07:23,430 >> Mi Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Kaj tiu estas CS50. 153 00:07:25,840 --> 00:07:27,772