DOUG LLOYD: Som du begynner arbeider med funksjoner,
en annen ting kommer til å bli veldig viktig å forstå,
som er begrepet variable omfang.
Så omfanget er et karakteristisk for en variabel
som definerer fra hvilke funksjoner den variabelen kan nås.
>> Det er to primære scopes i C, lokale variabler og globale variabler.
Nå lokale variabler kan bare nås innen funksjonene
der de er opprettet.
De kan ikke nås av alle andre funksjon som finnes i programmet,
bare funksjonen i som den ble opprettet.
Globale variabler, på Derimot kan nås
av enhver funksjon i programmet.
Og grunnen til det er fordi de er ikke laget inne
av en bestemt funksjon.
Vi erklærer dem utenfor alle de funksjoner som
betyr at hver funksjon vet hvor det er og kan få tilgang til og manipulere det.
>> Så langt i kurset du har ganske mye jobbet utelukkende
med lokale variabler.
Her er et eksempel på en veldig, veldig enkel hovedfunksjon og en meget enkel
tilleggsfunksjon som vi har skrevet.
I dette tilfellet, x, hvilke Jeg har farget grønn bare
å markere lokaliteten eller omfanget av den variable,
er lokale for funksjonen trippel.
Hoved kan ikke referere til x i det hele tatt.
Det vet ikke hva det er.
Ingen annen funksjon, faktisk, hvis vi hadde flere funksjoner i her,
kunne henvise til x.
>> Tilsvarende resultater som jeg har farget blå, er lokal kun til hoved.
Bare hoved vet hva variabelen resultatet er.
triple kan ikke bruke den.
>> Nå som jeg nevnte, globale variabler eksisterer.
Hvis du erklærer at variabelen utsiden av en hvilken som helst funksjon,
alle funksjoner i Programmet kan referere til det.
Så i dette tilfellet har jeg fremhevet i grønn en global variabel deklarasjon.
I dette tilfellet variabel vesen erklært
kalles global, bare for å være svært tydelig om det.
Det er av typen float.
Og jeg tilordne den verdien 0,5050.
>> Du vil merke at i hoved og i trippel, er jeg i stand til å referere til global.
Og faktisk, hvis jeg går gjennom programmet som angitt, hoved første samtalene trippel,
trippel multipliserer globale av tre, som setter verdien til 1,5-noe,
1.51 eller noe sånt, og da hoved skriver også ut verdien
av global.
Så hoved vil ikke skrive ut 0,5050, det vil skrive ut globale ganger 3, 1.51.
Så du er nødt til å være forsiktig når du du arbeider med globale variabler.
Mens de er svært fleksibel i å være i stand til å sende informasjon
rundt slik at hver Funksjonen kan bruke den,
det kan også ha noe farlige konsekvenser
hvis en funksjonsendringer verdien av en variabel
før du forventer at det skal endres.
>> Hvorfor dette skillet saken?
Hvorfor skal vi bry deg om noen variabler er lokale og andre er global?
Vel, for det meste, lokale variabler i C er det som kalles vedtatt av verdi
når vi gjør et funksjonskall.
Hva betyr det?
>> Vel, når en variabel er passert av verdi, callee, som
er en annen måte å si funksjonen som mottar variabel som
blir sendt inn som en inngang, det faktisk ikke mottar den variabelen selv.
Det får sin egen kopi av det å jobbe med.
Dette er et veldig viktig skille.
Vi bare så en andre siden at med globale variabler,
hvis vi manipulere den globale variabel i en funksjon, effekten
ved at en bærer funksjon gjennom til hver annen funksjon.
>> Men med lokale variabler, det er ikke sant.
Hver funksjon når det mottar variabler som input
motta kopier av disse variablene, ikke de variablene selv.
Så hva er den bivirkning av det?
Det betyr at den variable i den som ringer, den funksjonen som
er å lage funksjonen samtalen, er uendret med mindre du overstyre den.
>> For eksempel, i denne koden foo er ikke endret i det hele tatt.
Int foo tilsvarer 4, kaller trippel av foo, innsiden av trippel,
vi forventer at foo ville multipliseres med tre og tilbake,
men det er faktisk ingen effekt.
>> Her skjønt, en veldig subtil forskjell.
Dette har den effekten vi ønsker.
Ser du hvorfor?
Vi overordnede foo i hoved denne gangen.
>> Så int foo tilsvarer 4, tilsvarer foo trippel foo, når vi gjør det ringe,
trippel får sin egen kopi av foo, sin egen kopi av fire.
Det står tilbake 4 ganger 3, eller hva variabel blir vedtatt i tider 3.
Og da vi tildele retur Verdien av trippel til foo igjen.
Så dette ville faktisk overskrive foo.
Dette er den eneste måten å gjøre dette med lokal variabel.
Så nå hvis vi legge til en annen linje med kode her
ved enden av hoved til skrive ut verdien av foo,
det ville faktisk skrive ut 12.
>> Variable omfang er generelt ikke for mye av et problem
hvis du navnet alle dine variabler forskjellige ting.
Men det kan bli litt ekkel hvis det samme variabelnavn
vises i flere funksjoner, noe som vil skje mye.
Hvis du noen gang trenger å arbeide i den virkelige verden der
du arbeider på samarbeids programmer og mennesker i ulike lag
jobber sammen for å skrive det samme program eller det samme sett av programmer,
de vil ofte gjenbruke variabel navn, spesielt vanligste
som x, y, i, j, og så videre.
>> Men når variablene har samme navn, omfang saker
kan bli litt vanskeligere å analysere.
For eksempel, vet du hva ville bli skrevet ut
ved slutten av dette programmet?
Ta et minutt.
Pause videoen og lese gjennom dette programmet.
Du kan se på toppen vi har en funksjon erklæring
for en funksjon som kalles inkrement.
At funksjonen tar en enkelt parameter, et tall som vi kaller x.
Og det utganger et heltall.
Det er returtypen i begynnelsen.
>> Da har vi hoved, et par linjer av kode i hoved, hvor den siste
er en utskrift uttalelse.
Og husk, det er spørsmålet her.
Hva som faktisk kommer til å være trykket ved slutten av denne funksjon?
Og da vi faktisk har definisjon av tilveksten nedenfor.
>> Så ta et minutt, gå gjennom koden, spore ting ut.
Vet du hva som vil bli skrevet ut slutten av dette spesielle programmet?
>> Greit.
Forhåpentligvis har du tatt noen få sekunder å prøve og analysere dette ut.
La oss gjøre det sammen.
>> Så jeg har krysset ut tilveksten s erklæring på toppen der.
Det var litt av en distraksjon.
Det er ikke en egen variabel.
Det trenger ikke egen omfang.
Det er bare en funksjon erklæring, så med henblikk
for å prøve å sortere ut hva som er skjer i dette programmet,
Vi kan like godt bare unngå det.
>> Nå har vi i dette tilfellet Grunnen til at dette problemet er vanskelig
er fordi vi har lokale variabler i både hoved- og tilvekst, som hver
er kalt x.
Og selvfølgelig crux av dette problemet er prøver å suss ut som x blir endret
og hvordan virker det få endret.
Så jeg har farget alle forekomster av x som er lokale for hoved rødt.
Og jeg har farget alle forekomster av x det er lokal å øke blått.
>> Legg merke til i det tredje linje av hoved, lik y tilvekst
x, er det inkrement som ikke er passert hoved sin x, eller den røde x.
Det er å få sendt en kopi av den.
Og det er bare kommer til å jobbe med at kopi av det, den blå x.
Hvis du er matematisk tilbøyelig, kanskje du
har i stedet tenkt på dette som x sub m for hoved og x sub jeg for tilvekst.
Men det er den samme ideen.
x sub m, eller den røde x- i forrige slide,
er de variablene som er local-- er forekomsten av x snarere at
er lokale for main, og x sub i, eller blå variabler i forrige lysbilde,
er forekomster av x som er lokale for å øke.
>> Så, du var i stand til å finne ut hva denne funksjonen skrevet på slutten?
Jeg er Doug Lloyd, og dette er CS50.