DOUG LLOYD: Kiel vi komencas laborante kun funkcioj,
alia afero tuj fariĝis vere grave kompreni,
kiu estas la koncepto de ŝanĝiĝema amplekso.
Do amplekso estas karakteriza de variablo
kiu difinas de kiu funkcioj ke variablo povas esti alirita.
>> Ekzistas du primaraj medioj en C, lokaj variabloj kaj tutmondaj variabloj.
Nun, lokaj variabloj povas nur esti alirita ene la funkcioj
en kiu ili estas kreitaj.
Ili ne povas esti alirita de ĉiu alia funkcio kiu ekzistas en via programo,
nur la funkcio en kiu ĝi estis kreita.
Mallokajn variablojn, sur la Aliflanke, povas esti alirita
de iu funkcio en la programo.
Kaj la kialo estas ĉar ili ne kreis interne
de iu aparta funkcio.
Ni deklaras ilin ekster ĉiuj de la funkcioj, kiujn
signifas ke ĉiu funkcio scias kie estas kaj povas aliri kaj manipuli ĝin.
>> Ĝis nun en la kurso vi havas belajn multe laboris ekskluzive
kun lokaj variabloj.
Jen ekzemplo de tre, tre simpla ĉefan funkcion kaj tre simpla
aldona funkcio kiun ni skribis.
En tiu kazo, x, kiu Mi koloraj verdaj nur
reliefigi la loko aŭ la amplekso de tiu variablo,
estas loka al la funkcio triobla.
ĉefa ne povas rilati al x ajn.
Ĝi ne scias kion estas.
Neniu alia funkcio, fakte, se ni havis aldonaj funkcioj en ĉi tie,
povus rilati al x.
>> Simile, rezultoj kiujn mi havas kolorigita blua, estas lokaj nur al ĉefa.
Nur ĉefan scias kion la rezulto estas ŝanĝiĝema.
triobla ne povas uzi ĝin.
>> Nun kiel mi menciis, tutmonda variabloj ja ekzistas.
Se vi deklaras ke ŝanĝiĝema eksteren de ajna funkcio,
ĉiuj de la funkcioj en la programo povas referi al ĝi.
Do ĉi-kaze mi reliefigis en verda tutmonda variablo deklaro.
En tiu kazo, la ŝanĝiĝema estulo deklaris
nomata tutmonda, nur por esti ege klara pri tio.
Ĝi estas de tipo float.
Kaj mi atribui al ĝi la valoron 0,5050.
>> Vi rimarkos ke en ĉefa kaj en triobla, Mi povas rilati al tutmonda.
Kaj fakte, se mi iros tra la programo kiel indikita, ĉefaj unuaj alvokoj triobla,
triobla multiplikas tutmonda per 3, kiu fiksas ĝian valoron al 1.5-io,
1.51 aŭ io simila, kaj tiam ĉefa ankaŭ presas la valoron
de tutmondaj.
Do ĉefa ne elprinti 0,5050, ĝi presos tutmonda tempoj 3, 1.51.
Do vi devas esti zorgema kiam vi laboras kun tutmondaj variabloj.
Dum ili estas tre flekseblaj en povante pasi informo
ĉirkaŭe tiel, ke ĉiu funkcion povas uzi ĝin,
ĝi ankaŭ povas havi iun danĝeraj konsekvencoj
se unu funkcio ŝanĝoj la valoro de variablo
antaŭ vi atendas ĝin esti ŝanĝita.
>> Kial tiu distingo gravas?
Kial ni zorgas ĉu iuj variabloj estas lokaj kaj aliaj estas tutmonda?
Nu, plejparte, lokaj variabloj en C estas kio nomiĝas preteriris valoro
kiam ni faras funkcio nomita.
Kion tio signifas?
>> Nu, kiam variablo estas pasita per valoro, la callee, kiu
estas alia maniero diri la funkcio kiu ricevas la variablo kiu
gets pasis en kiel enigaĵoj, ĝi reale ne ricevas ke variablo mem.
Ĝi ricevas lian propran kopio por labori kun.
Jen vere grava distingo.
Ni ĵus vidis sekundo antaŭ ke kun tutmonda variabloj,
se ni manipulas la tutmonda ŝanĝiĝema en funkcio, la efekto
en tiu funkcio portas tra al ĉiu alia funkcio.
>> Sed kun lokaj variabloj, tio ne veras.
Ĉiu funkcio kiam ricevas variabloj kiel enigo
ricevi kopiojn de tiuj variabloj, Ne la variabloj mem.
Do kio estas la kromefikon de tio?
Tio signifas ke la variablo en la telefonanto, la funkcio kiu
estas farante la funkcio alvoko, estas senŝanĝa krom se vi nuligi ĝin.
>> Ekzemple, en tiu kodo umo ne ŝanĝis tute.
Int foo egalas 4, voki triobla de umo, ene de triobla,
ni atendus ke umo estus esti multiplikita de 3 kaj rehejmigxis
sed estas vere neniu efiko.
>> Jen tamen, tre subtila diferenco.
Tiu faras havi la efekton ni volas.
Ĉu vi komprenas kial?
Ni supera foo en ĉefaj tiu tempo.
>> Do int foo egalas 4, umo egalas triobla umo, kiam ni faros tiu alvoko,
triobla ricevas sian propran kopion de umo, lia propra kopio de 4.
Ĝi diras reveni 4 fojoj 3, aŭ kion ajn ŝanĝiĝema gets pasis en tempoj 3.
Kaj tiam ni atribui la reveno valoron de triobla al Foo denove.
Do tiu fakte estus anstataŭigi umo.
Tiu estas la sola maniero fari tiu kun loka variablo.
Do nun, se ni aldonas alian linio de kodo tie
fine de ĉefa por presi la valoro de foo,
ĝi fakte presi 12.
>> Ŝanĝiĝema amplekso estas ĝenerale ne tro multe de problemo
se vi nomu ĉiujn viajn variabloj malsamaj aferoj.
Sed ĝi povas akiri ia aĉa se la sama variablo nomo
aperas en multnombraj funkcioj, kio okazos multe.
Se vi iam ja laboras en la reala mondo, kie
vi laboras en kunlabora programoj kaj homoj en malsamaj teamoj
laboras kune skribi la saman programo aŭ la sama aro de programoj,
ili devos ofte reuzas ŝanĝiĝema nomoj, aparte komunaj
kiel x, y, i, j, kaj tiel plu.
>> Sed kiam variabloj havas la sama nomo, amplekso temoj
povas akiri iom pli delikata analizi.
Ekzemple, ĉu vi scias kio estus presita eksteren
ĉe la fino de ĉi tiu aparta programo?
Prenu unu minuto.
Paŭzi la videon kaj legis tra ĉi tiu programo.
Vi povas vidi ĉe la supro ni havas funkcion deklaro
por funkcio nomita pliigo.
Ke funkcio prenas sola parametro, entjero kiu ni nomas x.
Kaj ĝi eligas entjero.
Tio estas la reveno tipo en la komenco.
>> Tiam ni havas ĉefan, paro de linioj de kodo en ĉefa, la lasta de kiuj
Estas print instrukcio.
Kaj memoru, ke estas la demando ĉi tie.
Kio estas efektive tuj estos presita ĉe la fino de ĉi tiu funkcio?
Kaj tiam ni efektive havas la difino de pliigo sube.
>> Do prenu minuton, paŝi tra la kodo, spuri aferojn.
Ĉu vi scias kio estos presita ĉe Fine de ĉi tiu aparta programo?
>> Bone.
Espereble, vi jam prenitaj kelkaj sekundoj provi kaj analizi ĉi tiun.
Ni faru tion kune.
>> Do mi forstrekis pliigo la deklaracio ĉe la pinto.
Estis speco de distro.
Ĝi ne estas lia propra variablo.
Ĝi ne havas lian propran medion.
Estas nur funkcio deklaro, do por celoj
provi analizi kion estas okazas en tiu programo,
ni povus tiel simple eviti ŝin.
>> Nun ni havas en ĉi tiu kazo, la Tial ĉi tiu problemo estas malfacila
CXar ni lokaj variabloj en tiel ĉefaj pliigo, ĉiu el kiuj
estas nomata x.
Kaj kompreneble la quid de tiu afero estas provas süß el kiu x iĝas ŝanĝita
kaj kiel ĝi get ŝanĝis.
Do mi koloraj ĉiu okazo de x kiu estas loka al ĉefa ruĝa.
Kaj mi koloraj ĉiu petskribo de x tio lokaj pliigo blua.
>> Avizo en tiu tria linio de ĉefa, y egalas pliigo
x, ke pliigo ne estanta pasis ĉefa x, aŭ la ruĝa x.
Ĝi estas akiranta pasis kopion de ĝi.
Kaj ĝi estas nur tuj labori kun ke kopion de tio, la blua x.
Se vi estas matematike ema, vi eble
ili anstataŭe pripensis tion kiel x sub- m por ĉefa kaj x sub- i por pliigo.
Sed estas la sama ideo.
x sub m, aŭ la ruĝan X en la antaŭa glitejo,
estas la variabloj kiuj estas local-- estas la petskribo de x prefere ke
estas loka al ĉefa, kaj x sub i, aŭ la bluaj variabloj en la antaŭa glitejo,
estas la petskriboj de x kiu estas lokaj pliigo.
>> Do, vi estis kapabla kalkuli ekstere kion tiu funkcio presita ĉe la fino?
Mi Doug Lloyd, kaj ĉi tiu estas CS50.