DOUG LLOYD: Als je begint werken met functies,
een ander ding gaat worden heel belangrijk om te begrijpen,
dat het begrip vizier.
Dus scope is een kenmerkend een variabele
die bepaalt waaruit functies die variabele toegankelijk.
>> Er zijn twee primaire scopes in C, lokale variabelen en globale variabelen.
Nu, lokale variabelen kan alleen toegankelijk binnen de functies
waarin ze zijn gemaakt.
Ze kunnen niet worden benaderd door alle andere functie die bestaat in uw programma,
alleen de functie waarvan het is gemaakt.
Globale variabelen op Anderzijds toegankelijk
door een functie van het programma.
De reden daarvoor is omdat ze niet naar binnen gecreëerd
van een bepaalde functie.
Wij verklaren hen buiten alle functies, die
betekent dat elke functie weet waar het is en kan openen en manipuleren.
>> Tot nu toe in de loop je vrij hebt veel is uitsluitend
lokale variabelen.
Hier is een voorbeeld van een zeer, zeer eenvoudige hoofdfunctie en een eenvoudige
extra functie die we hebben geschreven.
In dit geval, x, waarin Ik heb groene net gekleurd
om de plaats te markeren of de omvang van die variabele,
is lokaal voor de functie drievoudige.
belangrijkste kan niet verwijzen naar x helemaal.
Het weet niet wat het is.
Geen andere functie, in feite, als we had extra functies hier,
kan verwijzen naar x.
>> Ook de resultaten die ik heb blauw gekleurd, is de plaatselijke alleen de belangrijkste.
Alleen de belangrijkste weet wat de variabele resultaat.
triple kan het niet gebruiken.
>> Nu zoals ik al zei, globale variabelen bestaan.
Als u verklaren dat de variabele buitenkant van elke functie,
alle functies in de programma kan verwijzen.
Dus in dit geval heb ik benadrukt in groen een globale variabele verklaring.
In dit geval variabele wordt verklaard
is wereldwijd geroepen, alleen maar om zijn zeer duidelijk over.
Het is van het type float.
En ik wijs het de waarde 0,5050.
>> U zult merken dat in de belangrijkste en in triple, ik ben in staat om te verwijzen naar mondiaal.
En inderdaad, als ik door het programma zoals aangegeven, de belangrijkste eerste oproepen triple,
triple vermenigvuldigt globaal met 3, die stelt de waarde tot 1,5-iets,
1.51 of iets dergelijks, en Vervolgens belangrijkste drukt ook de waarde
van de wereldwijde.
Dus belangrijkste zal niet afgedrukt 0,5050, is zal uitprinten wereldwijde tijden 3, 1,51.
Dus je moet voorzichtig zijn bij het je werkt met de globale variabelen.
Terwijl ze zeer flexibel in het kunnen informatie doorgeven
rond zodat elke functie kan gebruiken,
het kan ook sommige hebben gevaarlijke gevolgen
Als één functie verandert de waarde van een variabele
voordat je verwacht te worden veranderd.
>> Waarom maakt dit onderscheid uit?
Waarom hebben we schelen of enkele variabelen zijn lokale en anderen zijn wereldwijde?
Welnu, voor het grootste gedeelte, lokale variabelen in C zijn wat heet doorgegeven door de waarde
wanneer we een functie aan te roepen.
Wat betekent dat?
>> Nou, als een variabele wordt doorgegeven in waarde, de callee, die
is een andere manier om de functie te zeggen dat wordt ontvangen van de variabele die
wordt doorgegeven in als input, het eigenlijk geen krijgt de variabele zelf.
Het ontvangt zijn eigen kopie ervan mee te werken.
Dit is een heel belangrijk onderscheid.
We zagen slechts een seconde geleden dat met de globale variabelen,
Als we manipuleren wereldwijd variabele in functie effect
dat één functie draagt tot iedere functie.
>> Maar met lokale variabelen, dat is niet waar.
Elke functie als het ontvangt variabelen als invoer
kopieën van deze variabelen te ontvangen, niet de variabelen zelf.
Dus wat is de bijwerking van dat?
Dat betekent dat de variabele de beller de functie
is het maken van de functie oproep is ongewijzigd tenzij u het overschrijven.
>> Bijvoorbeeld, in deze code foo is helemaal niet veranderd.
Int foo is gelijk aan 4, bel triple van foo, de binnenkant van triple,
we zouden verwachten dat foo zou vermenigvuldigd met 3 en keerde terug,
maar er is eigenlijk geen effect.
>> Hier wel een zeer subtiel verschil.
Dit heeft tot gevolg hebben dat we willen.
Zie je waarom?
We dwingende foo in het hoofdgebouw deze tijd.
>> Zo int foo is gelijk aan 4, foo is gelijk aan triple foo, als we dat gesprek,
triple krijgt zijn eigen exemplaar van foo, haar eigen exemplaar van 4.
Het zegt terugkeren 4 keer 3, of wat dan ook variabele wordt doorgegeven in tijden 3.
En dan is de return wijzen wij waarde van de triple weer foo.
Dus dit zou eigenlijk foo overschrijven.
Dit is de enige manier om te doen dit met de lokale variabele.
Dus nu als we een ander voegen regel code hier
eind belangrijkste te afdruk van de waarde van foo,
het zou in feite uit te printen 12.
>> Variabele reikwijdte is over het algemeen niet al te veel van een probleem
als je al de naam van uw variabelen verschillende dingen.
Maar het kan soort vervelende Als dezelfde variabele
verschijnt in meerdere functies die zal een hoop gebeuren.
Als je ooit hoeft te werken in de echte wereld waar
u werkt op collaborative programma's en mensen in verschillende teams
werken samen aan hetzelfde te schrijven programma of dezelfde set van programma's,
zullen ze vaak variabele hergebruiken namen, in het bijzonder gemeenschappelijke regels
als x, y, i, j, enzovoorts.
>> Maar als variabelen dezelfde naam, scope kwesties
kan een beetje lastiger te ontleden.
Bijvoorbeeld, weet u wat zou worden afgedrukt
Aan het einde van dit programma?
Neem een ​​minuut.
Pauzeer de video en lees door middel van dit programma.
U kunt op de top zien we hebben een functie verklaring
een functie genaamd increment.
Deze functie neemt een enkele parameter een integer die we x noemen.
En voert een integer.
Dat is het type return in het begin.
>> Dan hebben we de belangrijkste, een paar regels van de code in de belangrijkste, waarvan de laatste
is een print statement.
En vergeet niet, dat is de vraag hier.
Wat is er eigenlijk aan de hand te zijn afgedrukt aan het einde van deze functie?
En dan hebben we eigenlijk de begrip increment beneden.
>> Dus neem een ​​minuut, stap door de code, sporenelementen dingen uit.
Weet je wat zal op worden afgedrukt het einde van dit programma?
>> Prima.
Hopelijk heb je een paar seconden genomen te proberen en te ontleden dit één.
Laten we het samen doen.
>> Dus ik heb doorgestreept increment's verklaring op de top daar.
Het was een beetje een afleiding.
Het is geen eigen variabele.
Het heeft geen eigen ruimte.
Het is gewoon een functie verklaring, dus met het oog
van het proberen te analyseren wat er gebeurt in dit programma,
kunnen we net zo goed gewoon vermijden.
>> Nu hebben we in dit geval reden van dit probleem is lastig
is want we hebben lokale variabelen in zowel hoofd- en increment, die elk
is genaamd x.
En natuurlijk de kern van dit probleem is proberen om suss welke x wordt veranderd
en hoe werkt het veranderd.
Dus ik heb elke instantie gekleurde van x dat is de lokale naar de belangrijkste rood.
En ik heb elke instantie van gekleurde x dat is de lokale op te hogen blauw.
>> Merk op dat in dat derde lijn van de belangrijkste, y gelijk increment
x, is dat de toename niet zijnde doorgegeven belangrijkste's x of de rode x.
Het wordt aangenomen een kopie van.
En het wordt alleen maar werken met die kopie van het, de blauwe x.
Als je wiskundig bent geneigd zijn, zou je
In plaats daarvan hebben gedacht dat als x sub m voor hoofd- en x sub i voor stap.
Maar het is hetzelfde idee.
x sub m, of de rode x's in de vorige dia
zijn de variabelen die zijn local-- is het exemplaar van x eerder dat
is de belangrijkste lokale en x sub i, of de blauwe variabelen in de vorige dia,
zijn voorbeelden van x die zijn lokale tijden te verhogen.
>> Dus, je was in staat om erachter te komen wat Deze functie die eind?
Ik ben Doug Lloyd, en dit is CS50.