1 00:00:00,000 --> 00:00:05,300 2 00:00:05,300 --> 00:00:07,300 DOUG LLOYD: Als je begint werken met functies, 3 00:00:07,300 --> 00:00:09,966 een ander ding gaat worden heel belangrijk om te begrijpen, 4 00:00:09,966 --> 00:00:12,380 dat het begrip vizier. 5 00:00:12,380 --> 00:00:14,490 Dus scope is een kenmerkend een variabele 6 00:00:14,490 --> 00:00:18,860 die bepaalt waaruit functies die variabele toegankelijk. 7 00:00:18,860 --> 00:00:24,595 >> Er zijn twee primaire scopes in C, lokale variabelen en globale variabelen. 8 00:00:24,595 --> 00:00:27,830 Nu, lokale variabelen kan alleen toegankelijk binnen de functies 9 00:00:27,830 --> 00:00:29,045 waarin ze zijn gemaakt. 10 00:00:29,045 --> 00:00:32,170 Ze kunnen niet worden benaderd door alle andere functie die bestaat in uw programma, 11 00:00:32,170 --> 00:00:34,184 alleen de functie waarvan het is gemaakt. 12 00:00:34,184 --> 00:00:36,350 Globale variabelen op Anderzijds toegankelijk 13 00:00:36,350 --> 00:00:37,719 door een functie van het programma. 14 00:00:37,719 --> 00:00:40,260 De reden daarvoor is omdat ze niet naar binnen gecreëerd 15 00:00:40,260 --> 00:00:41,441 van een bepaalde functie. 16 00:00:41,441 --> 00:00:43,690 Wij verklaren hen buiten alle functies, die 17 00:00:43,690 --> 00:00:48,940 betekent dat elke functie weet waar het is en kan openen en manipuleren. 18 00:00:48,940 --> 00:00:52,010 >> Tot nu toe in de loop je vrij hebt veel is uitsluitend 19 00:00:52,010 --> 00:00:54,280 lokale variabelen. 20 00:00:54,280 --> 00:00:58,320 Hier is een voorbeeld van een zeer, zeer eenvoudige hoofdfunctie en een eenvoudige 21 00:00:58,320 --> 00:01:00,680 extra functie die we hebben geschreven. 22 00:01:00,680 --> 00:01:03,180 In dit geval, x, waarin Ik heb groene net gekleurd 23 00:01:03,180 --> 00:01:07,400 om de plaats te markeren of de omvang van die variabele, 24 00:01:07,400 --> 00:01:09,240 is lokaal voor de functie drievoudige. 25 00:01:09,240 --> 00:01:12,300 belangrijkste kan niet verwijzen naar x helemaal. 26 00:01:12,300 --> 00:01:14,259 Het weet niet wat het is. 27 00:01:14,259 --> 00:01:17,050 Geen andere functie, in feite, als we had extra functies hier, 28 00:01:17,050 --> 00:01:19,360 kan verwijzen naar x. 29 00:01:19,360 --> 00:01:23,520 >> Ook de resultaten die ik heb blauw gekleurd, is de plaatselijke alleen de belangrijkste. 30 00:01:23,520 --> 00:01:26,980 Alleen de belangrijkste weet wat de variabele resultaat. 31 00:01:26,980 --> 00:01:30,010 triple kan het niet gebruiken. 32 00:01:30,010 --> 00:01:32,580 >> Nu zoals ik al zei, globale variabelen bestaan. 33 00:01:32,580 --> 00:01:35,575 Als u verklaren dat de variabele buitenkant van elke functie, 34 00:01:35,575 --> 00:01:38,290 alle functies in de programma kan verwijzen. 35 00:01:38,290 --> 00:01:44,010 Dus in dit geval heb ik benadrukt in groen een globale variabele verklaring. 36 00:01:44,010 --> 00:01:45,830 In dit geval variabele wordt verklaard 37 00:01:45,830 --> 00:01:48,720 is wereldwijd geroepen, alleen maar om zijn zeer duidelijk over. 38 00:01:48,720 --> 00:01:49,720 Het is van het type float. 39 00:01:49,720 --> 00:01:52,940 En ik wijs het de waarde 0,5050. 40 00:01:52,940 --> 00:01:58,080 >> U zult merken dat in de belangrijkste en in triple, ik ben in staat om te verwijzen naar mondiaal. 41 00:01:58,080 --> 00:02:03,480 En inderdaad, als ik door het programma zoals aangegeven, de belangrijkste eerste oproepen triple, 42 00:02:03,480 --> 00:02:10,440 triple vermenigvuldigt globaal met 3, die stelt de waarde tot 1,5-iets, 43 00:02:10,440 --> 00:02:16,080 1.51 of iets dergelijks, en Vervolgens belangrijkste drukt ook de waarde 44 00:02:16,080 --> 00:02:16,620 van de wereldwijde. 45 00:02:16,620 --> 00:02:24,424 Dus belangrijkste zal niet afgedrukt 0,5050, is zal uitprinten wereldwijde tijden 3, 1,51. 46 00:02:24,424 --> 00:02:27,340 Dus je moet voorzichtig zijn bij het je werkt met de globale variabelen. 47 00:02:27,340 --> 00:02:30,260 Terwijl ze zeer flexibel in het kunnen informatie doorgeven 48 00:02:30,260 --> 00:02:32,650 rond zodat elke functie kan gebruiken, 49 00:02:32,650 --> 00:02:34,580 het kan ook sommige hebben gevaarlijke gevolgen 50 00:02:34,580 --> 00:02:38,770 Als één functie verandert de waarde van een variabele 51 00:02:38,770 --> 00:02:42,360 voordat je verwacht te worden veranderd. 52 00:02:42,360 --> 00:02:44,200 >> Waarom maakt dit onderscheid uit? 53 00:02:44,200 --> 00:02:48,070 Waarom hebben we schelen of enkele variabelen zijn lokale en anderen zijn wereldwijde? 54 00:02:48,070 --> 00:02:53,880 Welnu, voor het grootste gedeelte, lokale variabelen in C zijn wat heet doorgegeven door de waarde 55 00:02:53,880 --> 00:02:56,087 wanneer we een functie aan te roepen. 56 00:02:56,087 --> 00:02:56,920 Wat betekent dat? 57 00:02:56,920 --> 00:03:00,880 >> Nou, als een variabele wordt doorgegeven in waarde, de callee, die 58 00:03:00,880 --> 00:03:04,350 is een andere manier om de functie te zeggen dat wordt ontvangen van de variabele die 59 00:03:04,350 --> 00:03:08,465 wordt doorgegeven in als input, het eigenlijk geen krijgt de variabele zelf. 60 00:03:08,465 --> 00:03:12,490 Het ontvangt zijn eigen kopie ervan mee te werken. 61 00:03:12,490 --> 00:03:14,350 Dit is een heel belangrijk onderscheid. 62 00:03:14,350 --> 00:03:18,250 We zagen slechts een seconde geleden dat met de globale variabelen, 63 00:03:18,250 --> 00:03:23,240 Als we manipuleren wereldwijd variabele in functie effect 64 00:03:23,240 --> 00:03:26,390 dat één functie draagt tot iedere functie. 65 00:03:26,390 --> 00:03:28,920 >> Maar met lokale variabelen, dat is niet waar. 66 00:03:28,920 --> 00:03:32,060 Elke functie als het ontvangt variabelen als invoer 67 00:03:32,060 --> 00:03:36,367 kopieën van deze variabelen te ontvangen, niet de variabelen zelf. 68 00:03:36,367 --> 00:03:37,825 Dus wat is de bijwerking van dat? 69 00:03:37,825 --> 00:03:40,450 Dat betekent dat de variabele de beller de functie 70 00:03:40,450 --> 00:03:45,600 is het maken van de functie oproep is ongewijzigd tenzij u het overschrijven. 71 00:03:45,600 --> 00:03:50,420 >> Bijvoorbeeld, in deze code foo is helemaal niet veranderd. 72 00:03:50,420 --> 00:03:55,450 Int foo is gelijk aan 4, bel triple van foo, de binnenkant van triple, 73 00:03:55,450 --> 00:03:58,850 we zouden verwachten dat foo zou vermenigvuldigd met 3 en keerde terug, 74 00:03:58,850 --> 00:04:01,450 maar er is eigenlijk geen effect. 75 00:04:01,450 --> 00:04:03,460 >> Hier wel een zeer subtiel verschil. 76 00:04:03,460 --> 00:04:06,520 Dit heeft tot gevolg hebben dat we willen. 77 00:04:06,520 --> 00:04:07,730 Zie je waarom? 78 00:04:07,730 --> 00:04:11,500 We dwingende foo in het hoofdgebouw deze tijd. 79 00:04:11,500 --> 00:04:16,899 >> Zo int foo is gelijk aan 4, foo is gelijk aan triple foo, als we dat gesprek, 80 00:04:16,899 --> 00:04:21,680 triple krijgt zijn eigen exemplaar van foo, haar eigen exemplaar van 4. 81 00:04:21,680 --> 00:04:27,340 Het zegt terugkeren 4 keer 3, of wat dan ook variabele wordt doorgegeven in tijden 3. 82 00:04:27,340 --> 00:04:32,109 En dan is de return wijzen wij waarde van de triple weer foo. 83 00:04:32,109 --> 00:04:33,650 Dus dit zou eigenlijk foo overschrijven. 84 00:04:33,650 --> 00:04:35,816 Dit is de enige manier om te doen dit met de lokale variabele. 85 00:04:35,816 --> 00:04:38,120 Dus nu als we een ander voegen regel code hier 86 00:04:38,120 --> 00:04:40,870 eind belangrijkste te afdruk van de waarde van foo, 87 00:04:40,870 --> 00:04:45,030 het zou in feite uit te printen 12. 88 00:04:45,030 --> 00:04:48,600 >> Variabele reikwijdte is over het algemeen niet al te veel van een probleem 89 00:04:48,600 --> 00:04:51,190 als je al de naam van uw variabelen verschillende dingen. 90 00:04:51,190 --> 00:04:54,920 Maar het kan soort vervelende Als dezelfde variabele 91 00:04:54,920 --> 00:04:58,820 verschijnt in meerdere functies die zal een hoop gebeuren. 92 00:04:58,820 --> 00:05:02,130 Als je ooit hoeft te werken in de echte wereld waar 93 00:05:02,130 --> 00:05:06,080 u werkt op collaborative programma's en mensen in verschillende teams 94 00:05:06,080 --> 00:05:11,000 werken samen aan hetzelfde te schrijven programma of dezelfde set van programma's, 95 00:05:11,000 --> 00:05:13,900 zullen ze vaak variabele hergebruiken namen, in het bijzonder gemeenschappelijke regels 96 00:05:13,900 --> 00:05:18,020 als x, y, i, j, enzovoorts. 97 00:05:18,020 --> 00:05:20,370 >> Maar als variabelen dezelfde naam, scope kwesties 98 00:05:20,370 --> 00:05:23,080 kan een beetje lastiger te ontleden. 99 00:05:23,080 --> 00:05:26,790 Bijvoorbeeld, weet u wat zou worden afgedrukt 100 00:05:26,790 --> 00:05:30,190 Aan het einde van dit programma? 101 00:05:30,190 --> 00:05:31,280 Neem een ​​minuut. 102 00:05:31,280 --> 00:05:33,382 Pauzeer de video en lees door middel van dit programma. 103 00:05:33,382 --> 00:05:35,590 U kunt op de top zien we hebben een functie verklaring 104 00:05:35,590 --> 00:05:37,350 een functie genaamd increment. 105 00:05:37,350 --> 00:05:40,800 Deze functie neemt een enkele parameter een integer die we x noemen. 106 00:05:40,800 --> 00:05:42,610 En voert een integer. 107 00:05:42,610 --> 00:05:44,820 Dat is het type return in het begin. 108 00:05:44,820 --> 00:05:48,140 >> Dan hebben we de belangrijkste, een paar regels van de code in de belangrijkste, waarvan de laatste 109 00:05:48,140 --> 00:05:49,250 is een print statement. 110 00:05:49,250 --> 00:05:51,140 En vergeet niet, dat is de vraag hier. 111 00:05:51,140 --> 00:05:54,240 Wat is er eigenlijk aan de hand te zijn afgedrukt aan het einde van deze functie? 112 00:05:54,240 --> 00:05:58,110 En dan hebben we eigenlijk de begrip increment beneden. 113 00:05:58,110 --> 00:06:01,760 >> Dus neem een ​​minuut, stap door de code, sporenelementen dingen uit. 114 00:06:01,760 --> 00:06:08,100 Weet je wat zal op worden afgedrukt het einde van dit programma? 115 00:06:08,100 --> 00:06:08,600 >> Prima. 116 00:06:08,600 --> 00:06:11,433 Hopelijk heb je een paar seconden genomen te proberen en te ontleden dit één. 117 00:06:11,433 --> 00:06:13,370 Laten we het samen doen. 118 00:06:13,370 --> 00:06:16,022 >> Dus ik heb doorgestreept increment's verklaring op de top daar. 119 00:06:16,022 --> 00:06:17,230 Het was een beetje een afleiding. 120 00:06:17,230 --> 00:06:18,570 Het is geen eigen variabele. 121 00:06:18,570 --> 00:06:19,879 Het heeft geen eigen ruimte. 122 00:06:19,879 --> 00:06:21,920 Het is gewoon een functie verklaring, dus met het oog 123 00:06:21,920 --> 00:06:24,330 van het proberen te analyseren wat er gebeurt in dit programma, 124 00:06:24,330 --> 00:06:26,660 kunnen we net zo goed gewoon vermijden. 125 00:06:26,660 --> 00:06:29,560 >> Nu hebben we in dit geval reden van dit probleem is lastig 126 00:06:29,560 --> 00:06:34,030 is want we hebben lokale variabelen in zowel hoofd- en increment, die elk 127 00:06:34,030 --> 00:06:35,090 is genaamd x. 128 00:06:35,090 --> 00:06:39,830 En natuurlijk de kern van dit probleem is proberen om suss welke x wordt veranderd 129 00:06:39,830 --> 00:06:41,890 en hoe werkt het veranderd. 130 00:06:41,890 --> 00:06:46,900 Dus ik heb elke instantie gekleurde van x dat is de lokale naar de belangrijkste rood. 131 00:06:46,900 --> 00:06:52,040 En ik heb elke instantie van gekleurde x dat is de lokale op te hogen blauw. 132 00:06:52,040 --> 00:06:55,220 >> Merk op dat in dat derde lijn van de belangrijkste, y gelijk increment 133 00:06:55,220 --> 00:07:00,800 x, is dat de toename niet zijnde doorgegeven belangrijkste's x of de rode x. 134 00:07:00,800 --> 00:07:03,320 Het wordt aangenomen een kopie van. 135 00:07:03,320 --> 00:07:06,987 En het wordt alleen maar werken met die kopie van het, de blauwe x. 136 00:07:06,987 --> 00:07:08,820 Als je wiskundig bent geneigd zijn, zou je 137 00:07:08,820 --> 00:07:14,230 In plaats daarvan hebben gedacht dat als x sub m voor hoofd- en x sub i voor stap. 138 00:07:14,230 --> 00:07:15,700 Maar het is hetzelfde idee. 139 00:07:15,700 --> 00:07:18,999 x sub m, of de rode x's in de vorige dia 140 00:07:18,999 --> 00:07:21,790 zijn de variabelen die zijn local-- is het exemplaar van x eerder dat 141 00:07:21,790 --> 00:07:26,900 is de belangrijkste lokale en x sub i, of de blauwe variabelen in de vorige dia, 142 00:07:26,900 --> 00:07:30,760 zijn voorbeelden van x die zijn lokale tijden te verhogen. 143 00:07:30,760 --> 00:07:36,220 >> Dus, je was in staat om erachter te komen wat Deze functie die eind? 144 00:07:36,220 --> 00:07:39,420 Ik ben Doug Lloyd, en dit is CS50. 145 00:07:39,420 --> 00:07:41,542