DOUG LLOYD: Når du begynder arbejde med funktioner,
en anden ting er ved at blive virkelig vigtigt at forstå,
som er begrebet variable sigte.
Så anvendelsesområde er en karakteristisk for en variabel
der definerer fra hvilke funktioner kan tilgås denne variabel.
>> Der er to primære anvendelsesområder i C, lokale variable og globale variabler.
Nu kan lokale variable kun tilgås inden funktionerne
hvor de er oprettet.
De kan ikke tilgås af alle andre funktion, der findes i dit program,
kun funktionen i som det blev oprettet.
Globale variable, på Derimod kan tilgås
af en funktion i programmet.
Og grunden til det er fordi de er ikke skabt inde
af en bestemt funktion.
Vi erklærer dem uden for alle de funktioner, der
betyder, at hver funktion ved hvor det er og kan få adgang til og manipulere den.
>> Indtil videre i løbet, du har temmelig meget er blevet udelukkende arbejder
med lokale variabler.
Her er et eksempel på en meget, meget simple hovedfunktion og en meget enkel
ekstra funktion, som vi har skrevet.
I dette tilfælde, x, som Jeg har farvet grøn bare
at fremhæve den lokalitet eller rækkevidden af ​​denne variabel,
er lokal til funktionen triple.
vigtigste kan ikke henvise til x på alle.
Det er ikke, hvad det er.
Ingen anden funktion, i virkeligheden, hvis vi havde yderligere funktioner her,
kunne henvise til x.
>> Tilsvarende resultater, som jeg har farvet blå, er lokal kun main.
Kun vigtigste ved, hvad den variable resultat.
tredobbelt kan ikke bruge det.
>> Nu som jeg nævnte, globale variabler findes.
Hvis du erklærer, at variablen uden for enhver funktion,
alle funktionerne i Programmet kan henvise til det.
Så i dette tilfælde har jeg fremhævet i grøn en global variabel erklæring.
I dette tilfælde variabel erklæres
kaldes global, bare for at være ekstremt klar over det.
Det er af typen float.
Og jeg tildele den værdien 0,5050.
>> Du vil bemærke, at der i hovedsagen og i triple, jeg er i stand til at henvise til den globale.
Og i virkeligheden, hvis jeg går gennem programmet som indikeret, de vigtigste første indkaldelser triple,
triple ganger globale med 3, som sætter sin værdi til 1,5-noget,
1,51 eller sådan noget, og derefter vigtigste udskriver også ud værdien
af den globale.
Så vigtigste vil ikke udskrive 0,5050, det vil udskrive globale gange 3, 1,51.
Så du er nødt til at være forsigtig, når du arbejder med globale variabler.
Mens de er meget fleksible i at være i stand til at videregive oplysninger
rundt, så hver Funktionen kan bruge det,
det kan også have en vis farlige konsekvenser
Hvis en funktion ændringer værdien af ​​en variabel
før du forventer det skal ændres.
>> Hvorfor denne skelnen noget?
Hvorfor skal vi bekymre, om nogle variabler er lokale og andre er globalt?
Godt, for det meste, lokale variable i C er, hvad der kaldes vedtaget af værdi
når vi laver en funktion opkald.
Hvad betyder det?
>> Tja, når en variabel er passeret i værdi, callee, som
er en anden måde at sige den funktion der modtager variabel,
bliver vedtaget i som et input, det faktisk ikke modtager denne variabel selv.
Det modtager sin egen kopi af det at arbejde med.
Dette er en virkelig vigtig forskel.
Vi har lige set et sekund siden at med globale variabler,
hvis vi manipulere den globale variabel i én funktion, effekten
ved, at én funktion bærer igennem til alle andre funktioner.
>> Men med de lokale variabler, det er ikke sandt.
Hver funktion, når det modtager variabler som input
modtage kopier af disse variabler, ikke de variabler selv.
Så hvad er den bivirkning af det?
Det betyder, at variablen i den, der ringer, den funktion,
er at gøre funktionen opkald, er uændret, medmindre du tilsidesætter den.
>> For eksempel i denne kode foo ændres ikke på alle.
Int foo lig 4, kalder triple af foo, inde i triple,
vi ville forvente, at foo ville ganges med 3 og returneret,
men der er faktisk ingen effekt.
>> Her dog en meget subtil forskel.
Dette har den effekt, vi ønsker.
Kan du se hvorfor?
Vi altoverskyggende foo i main denne gang.
>> Så int foo lig 4, lig foo triple foo, når vi laver denne opfordring,
triple får sin egen kopi af foo, sin egen kopi af 4.
Den siger returnere 4 gange 3, eller hvad variabel bliver vedtaget i gange 3.
Og så er vi tildele afkast værdi af triple at foo igen.
Så dette rent faktisk ville overskrive foo.
Det er den eneste måde at gøre dette med lokal variabel.
Så nu hvis vi tilføjer en anden linje kode her
i slutningen af ​​vigtigste til udskrive værdien af ​​foo,
Det ville faktisk udskrive 12.
>> Variable sigte er generelt ikke for meget af et problem
hvis du navngive alle dine variabler forskellige ting.
Men det kan få slags væmmeligt hvis den samme variabelnavn
vises i flere funktioner, der vil ske en masse.
Hvis du nogensinde arbejder i den virkelige verden, hvor
du arbejder på kollaborativ programmer og mennesker i forskellige teams
arbejder sammen om at skrive det samme program eller det samme sæt af programmer,
de vil ofte genbruge variabel navne, især almindelige
som x, y, i, j, og så videre.
>> Men når variable har samme navn, scope spørgsmål
kan få lidt vanskeligere at analysere.
For eksempel kender du hvad der ville blive udskrevet
ved afslutningen af ​​dette program?
Tag et minut.
Pause videoen og læse gennem dette program.
Du kan se i toppen, vi har en funktion erklæring
for en funktion kaldet tilvækst.
At funktion tager en enkelt parameter, et heltal, som vi kalder x.
Og det udsender et heltal.
Det er afkastet typen i begyndelsen.
>> Så har vi main, et par linjer kode i main, hvoraf den sidste
er en udskrift erklæring.
Og husk, det er spørgsmålet her.
Hvad der rent faktisk kommer til at være trykt i slutningen af ​​denne funktion?
Og så har vi rent faktisk har definition af tilvækst nedenfor.
>> Så tag et minut, gå gennem koden, spore tingene ud.
Ved du, hvad der vil blive udskrevet på I slutningen af ​​dette program?
>> Okay.
Forhåbentlig har du taget et par sekunder at forsøge at analysere denne ene ud.
Lad os gøre det sammen.
>> Så jeg har overstreget tilvækst s erklæring i toppen der.
Det var lidt af en distraktion.
Det er ikke sin egen variabel.
Det har ikke sin egen anvendelsesområde.
Det er bare en funktion erklæring, så med henblik
for at forsøge at analysere, hvad der er sker i dette program,
Vi kan lige så godt bare undgå det.
>> Nu har vi i dette tilfælde, Grunden til dette problem er tricky
er fordi vi har lokale variabler i både hoved- og tilvækst, som hver
er kaldet x.
Og selvfølgelig kernen i dette spørgsmål er forsøger at gennemskue hvor X bliver ændret
og hvordan få ændret.
Så jeg har farvet alle tilfælde af x, der er lokal til main rød.
Og jeg har farvet alle forekomster af x, der er lokal til tilvækst blå.
>> Bemærk i den tredje linje af de vigtigste, y lig tilvækst
x, er den omhandlede ydelse ikke er bestået vigtigste s x, eller den røde x.
Det bliver vedtaget en kopi af den.
Og det er kun kommer til at arbejde med denne kopi af den, den blå x.
Hvis du er matematisk tilbøjelige, kan du
har i stedet tænkt på dette som x sub m til main og x sub i for tilvækst.
Men det er den samme idé.
x sub m eller den røde x'er i forrige dias,
er de variabler, der er local-- er den forekomst af x snarere at
er lokal til hoved, og x sub i, eller blå variabler i forrige dias,
er de forekomster af x, der er lokale for tilvækst.
>> Så var du i stand til at regne ud, hvad denne funktion trykt i slutningen?
Jeg Doug Lloyd, og det er CS50.