1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 DOUG LLOYD: Kiel vi komencas laborante kun funkcioj, 3 00:00:07,300 --> 00:00:09,966 alia afero tuj fariĝis vere grave kompreni, 4 00:00:09,966 --> 00:00:12,380 kiu estas la koncepto de ŝanĝiĝema amplekso. 5 00:00:12,380 --> 00:00:14,490 Do amplekso estas karakteriza de variablo 6 00:00:14,490 --> 00:00:18,860 kiu difinas de kiu funkcioj ke variablo povas esti alirita. 7 00:00:18,860 --> 00:00:24,595 >> Ekzistas du primaraj medioj en C, lokaj variabloj kaj tutmondaj variabloj. 8 00:00:24,595 --> 00:00:27,830 Nun, lokaj variabloj povas nur esti alirita ene la funkcioj 9 00:00:27,830 --> 00:00:29,045 en kiu ili estas kreitaj. 10 00:00:29,045 --> 00:00:32,170 Ili ne povas esti alirita de ĉiu alia funkcio kiu ekzistas en via programo, 11 00:00:32,170 --> 00:00:34,184 nur la funkcio en kiu ĝi estis kreita. 12 00:00:34,184 --> 00:00:36,350 Mallokajn variablojn, sur la Aliflanke, povas esti alirita 13 00:00:36,350 --> 00:00:37,719 de iu funkcio en la programo. 14 00:00:37,719 --> 00:00:40,260 Kaj la kialo estas ĉar ili ne kreis interne 15 00:00:40,260 --> 00:00:41,441 de iu aparta funkcio. 16 00:00:41,441 --> 00:00:43,690 Ni deklaras ilin ekster ĉiuj de la funkcioj, kiujn 17 00:00:43,690 --> 00:00:48,940 signifas ke ĉiu funkcio scias kie estas kaj povas aliri kaj manipuli ĝin. 18 00:00:48,940 --> 00:00:52,010 >> Ĝis nun en la kurso vi havas belajn multe laboris ekskluzive 19 00:00:52,010 --> 00:00:54,280 kun lokaj variabloj. 20 00:00:54,280 --> 00:00:58,320 Jen ekzemplo de tre, tre simpla ĉefan funkcion kaj tre simpla 21 00:00:58,320 --> 00:01:00,680 aldona funkcio kiun ni skribis. 22 00:01:00,680 --> 00:01:03,180 En tiu kazo, x, kiu Mi koloraj verdaj nur 23 00:01:03,180 --> 00:01:07,400 reliefigi la loko aŭ la amplekso de tiu variablo, 24 00:01:07,400 --> 00:01:09,240 estas loka al la funkcio triobla. 25 00:01:09,240 --> 00:01:12,300 ĉefa ne povas rilati al x ajn. 26 00:01:12,300 --> 00:01:14,259 Ĝi ne scias kion estas. 27 00:01:14,259 --> 00:01:17,050 Neniu alia funkcio, fakte, se ni havis aldonaj funkcioj en ĉi tie, 28 00:01:17,050 --> 00:01:19,360 povus rilati al x. 29 00:01:19,360 --> 00:01:23,520 >> Simile, rezultoj kiujn mi havas kolorigita blua, estas lokaj nur al ĉefa. 30 00:01:23,520 --> 00:01:26,980 Nur ĉefan scias kion la rezulto estas ŝanĝiĝema. 31 00:01:26,980 --> 00:01:30,010 triobla ne povas uzi ĝin. 32 00:01:30,010 --> 00:01:32,580 >> Nun kiel mi menciis, tutmonda variabloj ja ekzistas. 33 00:01:32,580 --> 00:01:35,575 Se vi deklaras ke ŝanĝiĝema eksteren de ajna funkcio, 34 00:01:35,575 --> 00:01:38,290 ĉiuj de la funkcioj en la programo povas referi al ĝi. 35 00:01:38,290 --> 00:01:44,010 Do ĉi-kaze mi reliefigis en verda tutmonda variablo deklaro. 36 00:01:44,010 --> 00:01:45,830 En tiu kazo, la ŝanĝiĝema estulo deklaris 37 00:01:45,830 --> 00:01:48,720 nomata tutmonda, nur por esti ege klara pri tio. 38 00:01:48,720 --> 00:01:49,720 Ĝi estas de tipo float. 39 00:01:49,720 --> 00:01:52,940 Kaj mi atribui al ĝi la valoron 0,5050. 40 00:01:52,940 --> 00:01:58,080 >> Vi rimarkos ke en ĉefa kaj en triobla, Mi povas rilati al tutmonda. 41 00:01:58,080 --> 00:02:03,480 Kaj fakte, se mi iros tra la programo kiel indikita, ĉefaj unuaj alvokoj triobla, 42 00:02:03,480 --> 00:02:10,440 triobla multiplikas tutmonda per 3, kiu fiksas ĝian valoron al 1.5-io, 43 00:02:10,440 --> 00:02:16,080 1.51 aŭ io simila, kaj tiam ĉefa ankaŭ presas la valoron 44 00:02:16,080 --> 00:02:16,620 de tutmondaj. 45 00:02:16,620 --> 00:02:24,424 Do ĉefa ne elprinti 0,5050, ĝi presos tutmonda tempoj 3, 1.51. 46 00:02:24,424 --> 00:02:27,340 Do vi devas esti zorgema kiam vi laboras kun tutmondaj variabloj. 47 00:02:27,340 --> 00:02:30,260 Dum ili estas tre flekseblaj en povante pasi informo 48 00:02:30,260 --> 00:02:32,650 ĉirkaŭe tiel, ke ĉiu funkcion povas uzi ĝin, 49 00:02:32,650 --> 00:02:34,580 ĝi ankaŭ povas havi iun danĝeraj konsekvencoj 50 00:02:34,580 --> 00:02:38,770 se unu funkcio ŝanĝoj la valoro de variablo 51 00:02:38,770 --> 00:02:42,360 antaŭ vi atendas ĝin esti ŝanĝita. 52 00:02:42,360 --> 00:02:44,200 >> Kial tiu distingo gravas? 53 00:02:44,200 --> 00:02:48,070 Kial ni zorgas ĉu iuj variabloj estas lokaj kaj aliaj estas tutmonda? 54 00:02:48,070 --> 00:02:53,880 Nu, plejparte, lokaj variabloj en C estas kio nomiĝas preteriris valoro 55 00:02:53,880 --> 00:02:56,087 kiam ni faras funkcio nomita. 56 00:02:56,087 --> 00:02:56,920 Kion tio signifas? 57 00:02:56,920 --> 00:03:00,880 >> Nu, kiam variablo estas pasita per valoro, la callee, kiu 58 00:03:00,880 --> 00:03:04,350 estas alia maniero diri la funkcio kiu ricevas la variablo kiu 59 00:03:04,350 --> 00:03:08,465 gets pasis en kiel enigaĵoj, ĝi reale ne ricevas ke variablo mem. 60 00:03:08,465 --> 00:03:12,490 Ĝi ricevas lian propran kopio por labori kun. 61 00:03:12,490 --> 00:03:14,350 Jen vere grava distingo. 62 00:03:14,350 --> 00:03:18,250 Ni ĵus vidis sekundo antaŭ ke kun tutmonda variabloj, 63 00:03:18,250 --> 00:03:23,240 se ni manipulas la tutmonda ŝanĝiĝema en funkcio, la efekto 64 00:03:23,240 --> 00:03:26,390 en tiu funkcio portas tra al ĉiu alia funkcio. 65 00:03:26,390 --> 00:03:28,920 >> Sed kun lokaj variabloj, tio ne veras. 66 00:03:28,920 --> 00:03:32,060 Ĉiu funkcio kiam ricevas variabloj kiel enigo 67 00:03:32,060 --> 00:03:36,367 ricevi kopiojn de tiuj variabloj, Ne la variabloj mem. 68 00:03:36,367 --> 00:03:37,825 Do kio estas la kromefikon de tio? 69 00:03:37,825 --> 00:03:40,450 Tio signifas ke la variablo en la telefonanto, la funkcio kiu 70 00:03:40,450 --> 00:03:45,600 estas farante la funkcio alvoko, estas senŝanĝa krom se vi nuligi ĝin. 71 00:03:45,600 --> 00:03:50,420 >> Ekzemple, en tiu kodo umo ne ŝanĝis tute. 72 00:03:50,420 --> 00:03:55,450 Int foo egalas 4, voki triobla de umo, ene de triobla, 73 00:03:55,450 --> 00:03:58,850 ni atendus ke umo estus esti multiplikita de 3 kaj rehejmigxis 74 00:03:58,850 --> 00:04:01,450 sed estas vere neniu efiko. 75 00:04:01,450 --> 00:04:03,460 >> Jen tamen, tre subtila diferenco. 76 00:04:03,460 --> 00:04:06,520 Tiu faras havi la efekton ni volas. 77 00:04:06,520 --> 00:04:07,730 Ĉu vi komprenas kial? 78 00:04:07,730 --> 00:04:11,500 Ni supera foo en ĉefaj tiu tempo. 79 00:04:11,500 --> 00:04:16,899 >> Do int foo egalas 4, umo egalas triobla umo, kiam ni faros tiu alvoko, 80 00:04:16,899 --> 00:04:21,680 triobla ricevas sian propran kopion de umo, lia propra kopio de 4. 81 00:04:21,680 --> 00:04:27,340 Ĝi diras reveni 4 fojoj 3, aŭ kion ajn ŝanĝiĝema gets pasis en tempoj 3. 82 00:04:27,340 --> 00:04:32,109 Kaj tiam ni atribui la reveno valoron de triobla al Foo denove. 83 00:04:32,109 --> 00:04:33,650 Do tiu fakte estus anstataŭigi umo. 84 00:04:33,650 --> 00:04:35,816 Tiu estas la sola maniero fari tiu kun loka variablo. 85 00:04:35,816 --> 00:04:38,120 Do nun, se ni aldonas alian linio de kodo tie 86 00:04:38,120 --> 00:04:40,870 fine de ĉefa por presi la valoro de foo, 87 00:04:40,870 --> 00:04:45,030 ĝi fakte presi 12. 88 00:04:45,030 --> 00:04:48,600 >> Ŝanĝiĝema amplekso estas ĝenerale ne tro multe de problemo 89 00:04:48,600 --> 00:04:51,190 se vi nomu ĉiujn viajn variabloj malsamaj aferoj. 90 00:04:51,190 --> 00:04:54,920 Sed ĝi povas akiri ia aĉa se la sama variablo nomo 91 00:04:54,920 --> 00:04:58,820 aperas en multnombraj funkcioj, kio okazos multe. 92 00:04:58,820 --> 00:05:02,130 Se vi iam ja laboras en la reala mondo, kie 93 00:05:02,130 --> 00:05:06,080 vi laboras en kunlabora programoj kaj homoj en malsamaj teamoj 94 00:05:06,080 --> 00:05:11,000 laboras kune skribi la saman programo aŭ la sama aro de programoj, 95 00:05:11,000 --> 00:05:13,900 ili devos ofte reuzas ŝanĝiĝema nomoj, aparte komunaj 96 00:05:13,900 --> 00:05:18,020 kiel x, y, i, j, kaj tiel plu. 97 00:05:18,020 --> 00:05:20,370 >> Sed kiam variabloj havas la sama nomo, amplekso temoj 98 00:05:20,370 --> 00:05:23,080 povas akiri iom pli delikata analizi. 99 00:05:23,080 --> 00:05:26,790 Ekzemple, ĉu vi scias kio estus presita eksteren 100 00:05:26,790 --> 00:05:30,190 ĉe la fino de ĉi tiu aparta programo? 101 00:05:30,190 --> 00:05:31,280 Prenu unu minuto. 102 00:05:31,280 --> 00:05:33,382 Paŭzi la videon kaj legis tra ĉi tiu programo. 103 00:05:33,382 --> 00:05:35,590 Vi povas vidi ĉe la supro ni havas funkcion deklaro 104 00:05:35,590 --> 00:05:37,350 por funkcio nomita pliigo. 105 00:05:37,350 --> 00:05:40,800 Ke funkcio prenas sola parametro, entjero kiu ni nomas x. 106 00:05:40,800 --> 00:05:42,610 Kaj ĝi eligas entjero. 107 00:05:42,610 --> 00:05:44,820 Tio estas la reveno tipo en la komenco. 108 00:05:44,820 --> 00:05:48,140 >> Tiam ni havas ĉefan, paro de linioj de kodo en ĉefa, la lasta de kiuj 109 00:05:48,140 --> 00:05:49,250 Estas print instrukcio. 110 00:05:49,250 --> 00:05:51,140 Kaj memoru, ke estas la demando ĉi tie. 111 00:05:51,140 --> 00:05:54,240 Kio estas efektive tuj estos presita ĉe la fino de ĉi tiu funkcio? 112 00:05:54,240 --> 00:05:58,110 Kaj tiam ni efektive havas la difino de pliigo sube. 113 00:05:58,110 --> 00:06:01,760 >> Do prenu minuton, paŝi tra la kodo, spuri aferojn. 114 00:06:01,760 --> 00:06:08,100 Ĉu vi scias kio estos presita ĉe Fine de ĉi tiu aparta programo? 115 00:06:08,100 --> 00:06:08,600 >> Bone. 116 00:06:08,600 --> 00:06:11,433 Espereble, vi jam prenitaj kelkaj sekundoj provi kaj analizi ĉi tiun. 117 00:06:11,433 --> 00:06:13,370 Ni faru tion kune. 118 00:06:13,370 --> 00:06:16,022 >> Do mi forstrekis pliigo la deklaracio ĉe la pinto. 119 00:06:16,022 --> 00:06:17,230 Estis speco de distro. 120 00:06:17,230 --> 00:06:18,570 Ĝi ne estas lia propra variablo. 121 00:06:18,570 --> 00:06:19,879 Ĝi ne havas lian propran medion. 122 00:06:19,879 --> 00:06:21,920 Estas nur funkcio deklaro, do por celoj 123 00:06:21,920 --> 00:06:24,330 provi analizi kion estas okazas en tiu programo, 124 00:06:24,330 --> 00:06:26,660 ni povus tiel simple eviti ŝin. 125 00:06:26,660 --> 00:06:29,560 >> Nun ni havas en ĉi tiu kazo, la Tial ĉi tiu problemo estas malfacila 126 00:06:29,560 --> 00:06:34,030 CXar ni lokaj variabloj en tiel ĉefaj pliigo, ĉiu el kiuj 127 00:06:34,030 --> 00:06:35,090 estas nomata x. 128 00:06:35,090 --> 00:06:39,830 Kaj kompreneble la quid de tiu afero estas provas süß el kiu x iĝas ŝanĝita 129 00:06:39,830 --> 00:06:41,890 kaj kiel ĝi get ŝanĝis. 130 00:06:41,890 --> 00:06:46,900 Do mi koloraj ĉiu okazo de x kiu estas loka al ĉefa ruĝa. 131 00:06:46,900 --> 00:06:52,040 Kaj mi koloraj ĉiu petskribo de x tio lokaj pliigo blua. 132 00:06:52,040 --> 00:06:55,220 >> Avizo en tiu tria linio de ĉefa, y egalas pliigo 133 00:06:55,220 --> 00:07:00,800 x, ke pliigo ne estanta pasis ĉefa x, aŭ la ruĝa x. 134 00:07:00,800 --> 00:07:03,320 Ĝi estas akiranta pasis kopion de ĝi. 135 00:07:03,320 --> 00:07:06,987 Kaj ĝi estas nur tuj labori kun ke kopion de tio, la blua x. 136 00:07:06,987 --> 00:07:08,820 Se vi estas matematike ema, vi eble 137 00:07:08,820 --> 00:07:14,230 ili anstataŭe pripensis tion kiel x sub- m por ĉefa kaj x sub- i por pliigo. 138 00:07:14,230 --> 00:07:15,700 Sed estas la sama ideo. 139 00:07:15,700 --> 00:07:18,999 x sub m, aŭ la ruĝan X en la antaŭa glitejo, 140 00:07:18,999 --> 00:07:21,790 estas la variabloj kiuj estas local-- estas la petskribo de x prefere ke 141 00:07:21,790 --> 00:07:26,900 estas loka al ĉefa, kaj x sub i, aŭ la bluaj variabloj en la antaŭa glitejo, 142 00:07:26,900 --> 00:07:30,760 estas la petskriboj de x kiu estas lokaj pliigo. 143 00:07:30,760 --> 00:07:36,220 >> Do, vi estis kapabla kalkuli ekstere kion tiu funkcio presita ĉe la fino? 144 00:07:36,220 --> 00:07:39,420 Mi Doug Lloyd, kaj ĉi tiu estas CS50. 145 00:07:39,420 --> 00:07:41,542