1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 Doug LLOYD: Kao što počnete rad s funkcijama, 3 00:00:07,300 --> 00:00:09,966 još jedna stvar će postati jako važno da razumiju, 4 00:00:09,966 --> 00:00:12,380 što je koncept varijablu opsegu. 5 00:00:12,380 --> 00:00:14,490 Dakle, opseg je karakteristika varijable 6 00:00:14,490 --> 00:00:18,860 koji definira iz kojih funkcija koje varijabla može pristupiti. 7 00:00:18,860 --> 00:00:24,595 >> Postoje dvije osnovne opsega u C, lokalne varijable i globalne varijable. 8 00:00:24,595 --> 00:00:27,830 Sada, lokalne varijable mogu samo može pristupiti unutar funkcija 9 00:00:27,830 --> 00:00:29,045 u kojem oni stvorili. 10 00:00:29,045 --> 00:00:32,170 Oni ne može pristupiti svaki drugi funkcija koja postoji u svom programu, 11 00:00:32,170 --> 00:00:34,184 samo funkcija u koje je stvorio. 12 00:00:34,184 --> 00:00:36,350 Globalne varijable, o s druge strane, može se pristupiti 13 00:00:36,350 --> 00:00:37,719 bilo koja funkcija u programu. 14 00:00:37,719 --> 00:00:40,260 A razlog za to je jer oni ne stvorena unutar 15 00:00:40,260 --> 00:00:41,441 bilo određenu funkciju. 16 00:00:41,441 --> 00:00:43,690 Mi ih proglasiti izvan svim funkcijama koje 17 00:00:43,690 --> 00:00:48,940 znači da je svaka funkcija zna gdje to i mogu pristupiti i manipulirati. 18 00:00:48,940 --> 00:00:52,010 >> Do sada je u toku ste lijepa mnogo radili isključivo 19 00:00:52,010 --> 00:00:54,280 s lokalnim varijablama. 20 00:00:54,280 --> 00:00:58,320 Evo primjer vrlo, vrlo Jednostavan glavna funkcija i vrlo jednostavan 21 00:00:58,320 --> 00:01:00,680 Dodatna funkcija koje sam napisao. 22 00:01:00,680 --> 00:01:03,180 U tom slučaju, x, koji je Ja sam zelene boje jednostavno 23 00:01:03,180 --> 00:01:07,400 označite mjesto ili opseg te varijable, 24 00:01:07,400 --> 00:01:09,240 je lokalno na funkciju trostrukog. 25 00:01:09,240 --> 00:01:12,300 Glavna ne može odnositi na x na sve. 26 00:01:12,300 --> 00:01:14,259 Ona ne zna što je to. 27 00:01:14,259 --> 00:01:17,050 Niti jedna druga funkcija, u stvari, ako imala dodatne funkcije ovdje, 28 00:01:17,050 --> 00:01:19,360 može upućivati ​​na x. 29 00:01:19,360 --> 00:01:23,520 >> Slično tome, rezultati koji sam plave boje, lokalna samo glavni. 30 00:01:23,520 --> 00:01:26,980 Samo glavna zna što varijabla rezultat. 31 00:01:26,980 --> 00:01:30,010 Trostruka ne mogu ga koristiti. 32 00:01:30,010 --> 00:01:32,580 >> Sada kao što sam spomenuo, ne postoje globalne varijable. 33 00:01:32,580 --> 00:01:35,575 Ako izjaviti da varijablu izvan bilo funkcije, 34 00:01:35,575 --> 00:01:38,290 sve funkcije u Program se odnosi na to. 35 00:01:38,290 --> 00:01:44,010 Tako je u ovom slučaju sam istaknuo u zeleni globalna varijabla izjava. 36 00:01:44,010 --> 00:01:45,830 U tom slučaju, varijabla biće proglašen 37 00:01:45,830 --> 00:01:48,720 zove globalno, samo da biti vrlo jasno o tome. 38 00:01:48,720 --> 00:01:49,720 To je tipa float. 39 00:01:49,720 --> 00:01:52,940 A ja ga dodijeliti vrijednost 0.5050. 40 00:01:52,940 --> 00:01:58,080 >> Primijetit ćete da u glavnom i trostruki, ja sam u mogućnosti da se odnosi na globalno. 41 00:01:58,080 --> 00:02:03,480 A u stvari, ako idem preko programa kao što je navedeno, glavna prva pozivi trostruki, 42 00:02:03,480 --> 00:02:10,440 trostruki umnožava globalne po 3, koji postavlja svoju vrijednost na 1,5-nešto, 43 00:02:10,440 --> 00:02:16,080 1,51 ili nešto slično, i zatim glavni i ispisuje vrijednost 44 00:02:16,080 --> 00:02:16,620 globalne. 45 00:02:16,620 --> 00:02:24,424 Dakle, glavna neće ispisati 0.5050 ga, će ispisati globalne puta 3, 1.51. 46 00:02:24,424 --> 00:02:27,340 Dakle, moraš biti oprezan kada radite s globalnim varijablama. 47 00:02:27,340 --> 00:02:30,260 Dok su oni vrlo fleksibilna u bitak u mogućnosti da prođe podatke 48 00:02:30,260 --> 00:02:32,650 okolo, tako da svaki funkcija može ga koristiti, 49 00:02:32,650 --> 00:02:34,580 to također može imati neke opasne posljedice 50 00:02:34,580 --> 00:02:38,770 ako je promjena jedna funkcija vrijednost varijable 51 00:02:38,770 --> 00:02:42,360 Prije nego što očekujete da se to promijeni. 52 00:02:42,360 --> 00:02:44,200 >> Zašto ta razlika važna? 53 00:02:44,200 --> 00:02:48,070 Zašto mi je stalo da li neke varijable su lokalni i drugi su globalno? 54 00:02:48,070 --> 00:02:53,880 Pa, za najveći dio, lokalne varijable u C su ono što se zove donosi vrijednost 55 00:02:53,880 --> 00:02:56,087 kad smo napraviti funkciju poziv. 56 00:02:56,087 --> 00:02:56,920 Što to znači? 57 00:02:56,920 --> 00:03:00,880 >> Pa, kad je prošao varijabla po vrijednosti, u pozivani, što 58 00:03:00,880 --> 00:03:04,350 je još jedan način govoreći funkciju koji prima varijablu koja 59 00:03:04,350 --> 00:03:08,465 dobiva prošao u kao ulaz, to je zapravo ne dobivaju tu samu varijablu. 60 00:03:08,465 --> 00:03:12,490 Ona dobiva vlastitu Kopija to raditi. 61 00:03:12,490 --> 00:03:14,350 Ovo je stvarno važna razlika. 62 00:03:14,350 --> 00:03:18,250 Upravo smo vidjeli prije sekundu da je s globalnim varijablama, 63 00:03:18,250 --> 00:03:23,240 ako manipulirati globalna varijabla u jednu funkciju, učinak 64 00:03:23,240 --> 00:03:26,390 time da jedna funkcija nosi do svake druge funkcije. 65 00:03:26,390 --> 00:03:28,920 >> Ali s lokalnim varijablama, to nije istina. 66 00:03:28,920 --> 00:03:32,060 Svaka funkcija, kada ga prima varijable kao ulaz 67 00:03:32,060 --> 00:03:36,367 dobivaju kopije tih varijabli, ne same varijable. 68 00:03:36,367 --> 00:03:37,825 Dakle, što je nuspojava toga? 69 00:03:37,825 --> 00:03:40,450 To znači da je varijabla u pozivatelj, funkcija 70 00:03:40,450 --> 00:03:45,600 je stvaranje funkcija poziv, je nepromijenjeno, osim ako ga nadjačati. 71 00:03:45,600 --> 00:03:50,420 >> Na primjer, u tom kodu foo nije promijenilo na sve. 72 00:03:50,420 --> 00:03:55,450 Int foo jednak 4, nazovite trostruki od foo, unutar triple, 73 00:03:55,450 --> 00:03:58,850 očekivali bismo da će foo pomnožiti s 3 i vratio, 74 00:03:58,850 --> 00:04:01,450 ali tu je zapravo nikakav učinak. 75 00:04:01,450 --> 00:04:03,460 >> Ovdje ipak, vrlo suptilna razlika. 76 00:04:03,460 --> 00:04:06,520 Ovo ima učinak koji želimo. 77 00:04:06,520 --> 00:04:07,730 Vidite li zašto? 78 00:04:07,730 --> 00:04:11,500 Mi preskakanja foo u glavnom ovom trenutku. 79 00:04:11,500 --> 00:04:16,899 >> Dakle int foo jednaka 4, foo jednak trostruki foo, kada smo napraviti taj poziv, 80 00:04:16,899 --> 00:04:21,680 Trostruka dobiva svoj primjerak od foo, vlastitom kopijom 4. 81 00:04:21,680 --> 00:04:27,340 Ona kaže da se vrate 4 puta 3, ili što god varijabla dobiva prošao u vremenu 3. 82 00:04:27,340 --> 00:04:32,109 A onda smo dodijeliti povratak vrijednost trostruko ponovno foo. 83 00:04:32,109 --> 00:04:33,650 Dakle, to bi zapravo prebrisati foo. 84 00:04:33,650 --> 00:04:35,816 To je jedini način da to učinite ovo s lokalnim varijable. 85 00:04:35,816 --> 00:04:38,120 Pa sad, ako dodamo još linija koda ovdje 86 00:04:38,120 --> 00:04:40,870 na kraju glavni na ispisati vrijednost foo, 87 00:04:40,870 --> 00:04:45,030 to bi zapravo ispisati 12. 88 00:04:45,030 --> 00:04:48,600 >> Varijabilni opseg općenito Ne previše problema 89 00:04:48,600 --> 00:04:51,190 ako spomenemo sve svoje varijable različite stvari. 90 00:04:51,190 --> 00:04:54,920 Ali to može dobiti kakve neugodne ako isto ime varijable 91 00:04:54,920 --> 00:04:58,820 pojavljuje se u više funkcija, što će se dogoditi puno. 92 00:04:58,820 --> 00:05:02,130 Ako ste ikada raditi u stvarni svijet u kojem 93 00:05:02,130 --> 00:05:06,080 radite kolaborativni programa i ljudi u različitim timovima 94 00:05:06,080 --> 00:05:11,000 rade zajedno napisati isti Program ili isti skup programa, 95 00:05:11,000 --> 00:05:13,900 oni često će ponovno varijablu imena, osobito one uobičajene 96 00:05:13,900 --> 00:05:18,020 kao što su x, y, I, J, i tako dalje. 97 00:05:18,020 --> 00:05:20,370 >> No, kada su varijable isti naziv, djelokrug pitanja 98 00:05:20,370 --> 00:05:23,080 može dobiti malo trickier analizirati. 99 00:05:23,080 --> 00:05:26,790 Na primjer, znate li što bi se ispisati 100 00:05:26,790 --> 00:05:30,190 na kraju ovaj program? 101 00:05:30,190 --> 00:05:31,280 Uzmite minutu. 102 00:05:31,280 --> 00:05:33,382 Stanka video i čitati kroz ovaj program. 103 00:05:33,382 --> 00:05:35,590 Možete vidjeti na vrhu smo imaju funkciju izjavu 104 00:05:35,590 --> 00:05:37,350 za funkciju zove prirast. 105 00:05:37,350 --> 00:05:40,800 To je funkcija traje jedan parametar, cijeli broj koji zovemo x. 106 00:05:40,800 --> 00:05:42,610 I to izlazi cijeli broj. 107 00:05:42,610 --> 00:05:44,820 To je vrsta povratak na početku. 108 00:05:44,820 --> 00:05:48,140 >> Onda smo glavni, par redaka koda u glavnom, posljednji od kojih 109 00:05:48,140 --> 00:05:49,250 je izjava za ispis. 110 00:05:49,250 --> 00:05:51,140 I zapamtite, to je pitanje ovdje. 111 00:05:51,140 --> 00:05:54,240 Ono što se zapravo događa se tiskana na kraju ove funkcije? 112 00:05:54,240 --> 00:05:58,110 I onda mi zapravo imaju Definicija prirasta ispod. 113 00:05:58,110 --> 00:06:01,760 >> Dakle, uzeti minutu, korak po kod, pratiti stvari. 114 00:06:01,760 --> 00:06:08,100 Znate li što će se ispisati na kraj ovom programu? 115 00:06:08,100 --> 00:06:08,600 >> U redu. 116 00:06:08,600 --> 00:06:11,433 Nadamo se da ste uzeli nekoliko sekundi pokušati analizirati ovu jednu van. 117 00:06:11,433 --> 00:06:13,370 Učinimo to zajedno. 118 00:06:13,370 --> 00:06:16,022 >> Tako sam prešao iz prirast a izjava na vrhu tamo. 119 00:06:16,022 --> 00:06:17,230 To je vrsta ometanja. 120 00:06:17,230 --> 00:06:18,570 Nije vlastiti promjenjiva. 121 00:06:18,570 --> 00:06:19,879 To nema vlastiti djelokrug. 122 00:06:19,879 --> 00:06:21,920 To je samo funkcija izjava, tako da za potrebe 123 00:06:21,920 --> 00:06:24,330 pokušava analizirati ono što je događa u ovom programu, 124 00:06:24,330 --> 00:06:26,660 možemo i samo ga izbjeći. 125 00:06:26,660 --> 00:06:29,560 >> Sada smo u ovom slučaju, Razlog je taj problem je lukav 126 00:06:29,560 --> 00:06:34,030 je zato što imamo lokalne varijable u i glavni i prirast, od kojih je svaki 127 00:06:34,030 --> 00:06:35,090 zove x. 128 00:06:35,090 --> 00:06:39,830 I naravno poanta ovog pitanja je pokušavajući Süss koji x dobiva promijenila 129 00:06:39,830 --> 00:06:41,890 i kako to dobiti promijenilo. 130 00:06:41,890 --> 00:06:46,900 Tako sam boji sve instance x to je lokalno na glavni crveno. 131 00:06:46,900 --> 00:06:52,040 I ja sam obojen svaki primjerak x to je lokalna povećajte plave. 132 00:06:52,040 --> 00:06:55,220 >> Obavijest u tom trećem retku od glavne, y jednak prirast 133 00:06:55,220 --> 00:07:00,800 x, da prirast ne bude prošlo je glavna x, odnosno crveni x. 134 00:07:00,800 --> 00:07:03,320 To je uzimajući donijela kopiju. 135 00:07:03,320 --> 00:07:06,987 I to samo ide na posao s da kopija nje, plava x. 136 00:07:06,987 --> 00:07:08,820 Ako ste matematički skloni, možda 137 00:07:08,820 --> 00:07:14,230 umjesto toga mislili o tome što je x sub m za glavne i x sub I za prirast. 138 00:07:14,230 --> 00:07:15,700 Ali to je ista ideja. 139 00:07:15,700 --> 00:07:18,999 x sub m, odnosno crveni x-a u prethodnom slajdu, 140 00:07:18,999 --> 00:07:21,790 su varijable koje su local-- je instanca x umjesto da 141 00:07:21,790 --> 00:07:26,900 je lokalna na glavni, a x sub ja, ili plave varijabli u prethodnom slajdu, 142 00:07:26,900 --> 00:07:30,760 su slučajevi da x su lokalni povećavati. 143 00:07:30,760 --> 00:07:36,220 >> Dakle, bili ste u mogućnosti shvatiti što ova funkcija tiskana na kraju? 144 00:07:36,220 --> 00:07:39,420 Ja sam Doug Lloyd, a to je CS50. 145 00:07:39,420 --> 00:07:41,542