1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 DOUG LLOYD: Ako začnete práca s funkciami, 3 00:00:07,300 --> 00:00:09,966 ďalšia vec sa stane naozaj dôležité pochopiť, 4 00:00:09,966 --> 00:00:12,380 ktorý je predstava o premenné rozsahu. 5 00:00:12,380 --> 00:00:14,490 Takže rozsah je charakteristika premenné 6 00:00:14,490 --> 00:00:18,860 , Ktorá definuje, z ktorého funkciou táto premenná možno získať prístup. 7 00:00:18,860 --> 00:00:24,595 >> Existujú dva základné odbory v C, lokálne premenné a globálne premenné. 8 00:00:24,595 --> 00:00:27,830 Teraz môžu iba lokálne premenné byť prístupné v rámci funkcie 9 00:00:27,830 --> 00:00:29,045 , V ktorom sú vytvorené. 10 00:00:29,045 --> 00:00:32,170 Nemôžu pristupovať každý druhý funkcia, ktorá existuje vo vašom programe, 11 00:00:32,170 --> 00:00:34,184 iba funkcie v ktorý bol vytvorený. 12 00:00:34,184 --> 00:00:36,350 Globálne premenné, na strane naopak, možno pristupovať 13 00:00:36,350 --> 00:00:37,719 by akékoľvek funkcie v programe. 14 00:00:37,719 --> 00:00:40,260 A dôvod pre to je pretože to nie sú vytvorené vo vnutri 15 00:00:40,260 --> 00:00:41,441 akejkoľvek konkrétnej funkcie. 16 00:00:41,441 --> 00:00:43,690 Prehlasujeme, je mimo všetky funkcie, ktoré 17 00:00:43,690 --> 00:00:48,940 Znamená to, že každá funkcia vie, kde to je a môže pristupovať a manipulovať. 18 00:00:48,940 --> 00:00:52,010 >> Doteraz sa v priebehu nemáš dosť veľa pracuje výhradne 19 00:00:52,010 --> 00:00:54,280 s lokálnymi premennými. 20 00:00:54,280 --> 00:00:58,320 Tu je príklad veľmi, veľmi jednoduché hlavné funkcie, a to veľmi jednoduchý 21 00:00:58,320 --> 00:01:00,680 doplnková funkcie, ktoré sme v písomnej forme. 22 00:01:00,680 --> 00:01:03,180 V tomto prípade, x, ktorý Ja som len zelenej farbe 23 00:01:03,180 --> 00:01:07,400 zvýraznite lokalitu alebo dosah tejto premennej, 24 00:01:07,400 --> 00:01:09,240 je miestna funkciu trojitého. 25 00:01:09,240 --> 00:01:12,300 Hlavné nemôže odkazovať na x vôbec. 26 00:01:12,300 --> 00:01:14,259 To nevie, čo to je. 27 00:01:14,259 --> 00:01:17,050 Žiadne iné funkcie, v skutočnosti, ak by sme mal ďalšie funkcie tu, 28 00:01:17,050 --> 00:01:19,360 by sa mohla týkať x. 29 00:01:19,360 --> 00:01:23,520 >> Podobne, výsledky, ktoré som modrej farby, je lokálne iba na hlavnej. 30 00:01:23,520 --> 00:01:26,980 Len hlavné vie, čo premenná výsledok. 31 00:01:26,980 --> 00:01:30,010 trojnásobný nemôže použiť. 32 00:01:30,010 --> 00:01:32,580 >> Teraz, ako som už spomenul, existujú globálne premenné. 33 00:01:32,580 --> 00:01:35,575 Ak deklarovať tejto premennej mimo akejkoľvek funkcie, 34 00:01:35,575 --> 00:01:38,290 všetky funkcie v Program môže odkazovať sa na to. 35 00:01:38,290 --> 00:01:44,010 Takže v tomto prípade som zvýraznené zelená a globálne premenné vyhlásenie. 36 00:01:44,010 --> 00:01:45,830 V tomto prípade je Premenná bytosť deklarovaná 37 00:01:45,830 --> 00:01:48,720 sa nazýva globálne, len preto, aby byť veľmi jasné, o tom. 38 00:01:48,720 --> 00:01:49,720 To je typu float. 39 00:01:49,720 --> 00:01:52,940 A ja som mu priradiť hodnota 0.5050. 40 00:01:52,940 --> 00:01:58,080 >> Všimnite si, že v hlavnej a trojitý, som schopný odkazovať na globálne. 41 00:01:58,080 --> 00:02:03,480 A v skutočnosti, keď pôjdem prostredníctvom programu ako je uvedené, hlavnou prvé výzvy triple, 42 00:02:03,480 --> 00:02:10,440 trojité násobí globálne o 3, ktoré nastaví jeho hodnotu na 1,5-niečo, 43 00:02:10,440 --> 00:02:16,080 1.51 alebo niečo také, a potom hlavný tiež vytlačí hodnotu 44 00:02:16,080 --> 00:02:16,620 na globálne. 45 00:02:16,620 --> 00:02:24,424 Takže hlavný nebude tlačiť 0.5050 to, vytlačí globálne krát 3, 1.51. 46 00:02:24,424 --> 00:02:27,340 Takže musíš byť opatrní pri pracujete s globálne premenné. 47 00:02:27,340 --> 00:02:30,260 Zatiaľ čo oni sú veľmi flexibilné v budú môcť odovzdať informácie 48 00:02:30,260 --> 00:02:32,650 okolo tak, že každý Funkciu možno použiť, 49 00:02:32,650 --> 00:02:34,580 to tiež môže mať niektoré nebezpečné dôsledky 50 00:02:34,580 --> 00:02:38,770 ak zmení jedna funkcia hodnota premennej 51 00:02:38,770 --> 00:02:42,360 než sa očakávať, že to je potrebné zmeniť. 52 00:02:42,360 --> 00:02:44,200 >> Prečo tento rozdiel na tom? 53 00:02:44,200 --> 00:02:48,070 Prečo sa nám jedno, či niektoré premenné sú miestne a iní sú globálne? 54 00:02:48,070 --> 00:02:53,880 No, z väčšej časti, lokálne premenné v C sú to, čo sa nazýva odovzdané hodnotou 55 00:02:53,880 --> 00:02:56,087 keď urobíme volanie funkcie. 56 00:02:56,087 --> 00:02:56,920 Čo to znamená? 57 00:02:56,920 --> 00:03:00,880 >> Tak, keď je odovzdaný premenná hodnotou, volaným, ktorý 58 00:03:00,880 --> 00:03:04,350 je ďalší spôsob, ako hovoriť funkcie ktorý dostáva premennú, ktorá 59 00:03:04,350 --> 00:03:08,465 dostane prešiel v ako vstup, je to vlastne nedostane túto premennú sám. 60 00:03:08,465 --> 00:03:12,490 Prijíma vlastné kópiu, ktorá s ním pracovať. 61 00:03:12,490 --> 00:03:14,350 To je naozaj dôležitý rozdiel. 62 00:03:14,350 --> 00:03:18,250 Práve sme videli pred sekundou že u globálnych premenných, 63 00:03:18,250 --> 00:03:23,240 ak budeme manipulovať globálnej premenná v jednej funkcii, účinok 64 00:03:23,240 --> 00:03:26,390 v tom, že jedna funkcia nesie prostredníctvom na všetky ostatné funkcie. 65 00:03:26,390 --> 00:03:28,920 >> Ale s lokálnymi premennými, že to nie je pravda. 66 00:03:28,920 --> 00:03:32,060 Každá funkcia, ak ho prijíma premenné ako vstup 67 00:03:32,060 --> 00:03:36,367 dostať kópie týchto premenných, nie so samotnými premenné. 68 00:03:36,367 --> 00:03:37,825 Takže to, čo je vedľajší účinok, že? 69 00:03:37,825 --> 00:03:40,450 To znamená, že premenná v volajúci, funkcia, ktorá 70 00:03:40,450 --> 00:03:45,600 je robiť volanie funkcie, je bezo zmeny pokiaľ ju prepísať. 71 00:03:45,600 --> 00:03:50,420 >> Napríklad, v tomto kóde foo sa vôbec nezmenila. 72 00:03:50,420 --> 00:03:55,450 Int foo sa rovná 4, volajte triple z foo, vnútri triple, 73 00:03:55,450 --> 00:03:58,850 by sme očakávať, že by foo vynásobí 3 a vrátil sa, 74 00:03:58,850 --> 00:04:01,450 ale je to vlastne žiadny účinok. 75 00:04:01,450 --> 00:04:03,460 >> Tu však, veľmi jemný rozdiel. 76 00:04:03,460 --> 00:04:06,520 To však mať za následok, čo chceme. 77 00:04:06,520 --> 00:04:07,730 Vidíte, prečo? 78 00:04:07,730 --> 00:04:11,500 Sme naliehavými foo v hlavnom tejto dobe. 79 00:04:11,500 --> 00:04:16,899 >> Takže int foo sa rovná 4, foo rovná triple foo, keď urobíme, ktoré vyžadujú, 80 00:04:16,899 --> 00:04:21,680 triple dostane jeho vlastné kópiu Foo, vlastné kópiu 4. 81 00:04:21,680 --> 00:04:27,340 To hovorí, že sa vrátiť 4 krát 3, alebo čo premenná je odovzdaný v čase 3. 82 00:04:27,340 --> 00:04:32,109 A potom sme priradiť návratnosť Hodnota triple opäť foo. 83 00:04:32,109 --> 00:04:33,650 Takže to vlastne by prepísanie foo. 84 00:04:33,650 --> 00:04:35,816 To je jediný spôsob, ako robiť to s lokálne premenné. 85 00:04:35,816 --> 00:04:38,120 Takže teraz, keď sme sa pridať ďalšie riadok kódu tu 86 00:04:38,120 --> 00:04:40,870 Na konci Mohanom do vytlačiť hodnotu foo, 87 00:04:40,870 --> 00:04:45,030 že by v skutočnosti vytlačiť 12. 88 00:04:45,030 --> 00:04:48,600 >> Variabilné rozsah je všeobecne nie je príliš veľký problém 89 00:04:48,600 --> 00:04:51,190 Ak názov všetky vaše Premenné rôzne veci. 90 00:04:51,190 --> 00:04:54,920 Ale to môže dostať druh škaredé Ak rovnaký názov premennej 91 00:04:54,920 --> 00:04:58,820 sa objaví v rôznych funkciách, ktorá sa bude diať veľa. 92 00:04:58,820 --> 00:05:02,130 Ak ste niekedy robiť prácu v skutočný svet, kde 93 00:05:02,130 --> 00:05:06,080 pracujete na kolaboratívne programy a ľudia v rôznych tímoch 94 00:05:06,080 --> 00:05:11,000 spolupracujú písať to isté Program alebo rovnaký súbor programov, 95 00:05:11,000 --> 00:05:13,900 budú často opakovane používať premennú mená, najmä obyčajné 96 00:05:13,900 --> 00:05:18,020 ako x, y, I, J, a tak ďalej. 97 00:05:18,020 --> 00:05:20,370 >> Ale keď premenné majú rovnaký názov, otázky rozsah 98 00:05:20,370 --> 00:05:23,080 môže byť trochu zložitejšie analyzovať. 99 00:05:23,080 --> 00:05:26,790 Napríklad, viete, čo by vytlačiť 100 00:05:26,790 --> 00:05:30,190 Na konci tohto konkrétneho programu? 101 00:05:30,190 --> 00:05:31,280 Take minútu. 102 00:05:31,280 --> 00:05:33,382 Pozastaviť video a čítať prostredníctvom tohto programu. 103 00:05:33,382 --> 00:05:35,590 Môžete vidieť v hornej my majú vyhlásenie o funkciu 104 00:05:35,590 --> 00:05:37,350 pre funkciu nazvanú prírastok. 105 00:05:37,350 --> 00:05:40,800 Táto funkcia trvá jeden parameter, celé číslo, ktoré nazývame x. 106 00:05:40,800 --> 00:05:42,610 A to výstupy celé číslo. 107 00:05:42,610 --> 00:05:44,820 To je návratový typ na začiatku. 108 00:05:44,820 --> 00:05:48,140 >> Potom máme hlavné, pár riadkov kódu v hlavnej, z ktorých posledná 109 00:05:48,140 --> 00:05:49,250 je tlačová vyhlásenie. 110 00:05:49,250 --> 00:05:51,140 A pamätajte, že je to otázka tu. 111 00:05:51,140 --> 00:05:54,240 To, čo sa vlastne bude vytlačené na konci tejto funkcie? 112 00:05:54,240 --> 00:05:58,110 A potom sme vlastne mať Definícia prírastku nižšie. 113 00:05:58,110 --> 00:06:01,760 >> Tak sa chvíľku, krokovať kód, stopové veci. 114 00:06:01,760 --> 00:06:08,100 Viete, čo sa bude tlačiť na koniec tohto konkrétneho programu? 115 00:06:08,100 --> 00:06:08,600 >> Dobre. 116 00:06:08,600 --> 00:06:11,433 Dúfajme, že si vziať pár sekúnd aby sa pokúsila analyzovať tento jeden von. 117 00:06:11,433 --> 00:06:13,370 Poďme to urobiť spoločne. 118 00:06:13,370 --> 00:06:16,022 >> Takže som prečiarknutá prírastok je Vyhlásenie v tam hore. 119 00:06:16,022 --> 00:06:17,230 Bolo to trochu rozptýlenia. 120 00:06:17,230 --> 00:06:18,570 Nie je to jeho vlastný variabilný. 121 00:06:18,570 --> 00:06:19,879 Nemá svoj vlastný priestor. 122 00:06:19,879 --> 00:06:21,920 Je to len funkcie vyhlásenie, takže na účely 123 00:06:21,920 --> 00:06:24,330 sa snaží analyzovať, čo je deje v tomto programe, 124 00:06:24,330 --> 00:06:26,660 môžeme rovnako dobre sa mu vyhnúť. 125 00:06:26,660 --> 00:06:29,560 >> Teraz máme v tomto prípade, Dôvodom tohto problému je zložité 126 00:06:29,560 --> 00:06:34,030 je preto, že máme lokálne premenné v oba hlavné a prírastok, z ktorých každý 127 00:06:34,030 --> 00:06:35,090 je tzv x. 128 00:06:35,090 --> 00:06:39,830 A samozrejme podstata tohto problému je snaží sa Süss, aké x dostane zmenený 129 00:06:39,830 --> 00:06:41,890 a ako sa dostať k zmene. 130 00:06:41,890 --> 00:06:46,900 Takže som farebný všetky výskyty x, ktorá je lokálne na hlavnej červenej. 131 00:06:46,900 --> 00:06:52,040 A ja som farebné každý výskyt x, ktorá je miestny zvýšiť modrej. 132 00:06:52,040 --> 00:06:55,220 >> Všimnite si v tomto treťom riadku z hlavnej, y sa rovná prírastok 133 00:06:55,220 --> 00:07:00,800 x, že prírastok nie je prešiel hlavné je x, alebo červený x. 134 00:07:00,800 --> 00:07:03,320 Začína to prešiel jeho kópiu. 135 00:07:03,320 --> 00:07:06,987 A to len bude pracovať s že kópia toho, modrá x. 136 00:07:06,987 --> 00:07:08,820 Ak ste matematicky naklonený, môžete 137 00:07:08,820 --> 00:07:14,230 namiesto toho myslel na to, ako x sub m pre hlavné a sub x Aj pre prírastok. 138 00:07:14,230 --> 00:07:15,700 Ale je to rovnaký nápad. 139 00:07:15,700 --> 00:07:18,999 x sub m, alebo červený x je v predchádzajúcom snímke, 140 00:07:18,999 --> 00:07:21,790 sú premenné, ktoré sú local-- je inštancia x skôr, že 141 00:07:21,790 --> 00:07:26,900 je miestna hlavné, a x i náhradník, alebo modré premenné v predchádzajúcom snímke, 142 00:07:26,900 --> 00:07:30,760 sú prípady, ktoré x sú miestne zvýšiť. 143 00:07:30,760 --> 00:07:36,220 >> Takže, ste boli schopní zistiť, čo Táto funkcia vytlačené na konci? 144 00:07:36,220 --> 00:07:39,420 Som Doug Lloyd, a to je CS50. 145 00:07:39,420 --> 00:07:41,542