Дъг LLOYD: Като започнете работа с функции,
друго нещо ще стане Наистина е важно да се разбере,
който е концепцията за променлив обхват.
Така обхват е характеристика на променлива
който определя от кои функции тази променлива може да бъде достъпен.
>> Има два основни сфери в C, локални променливи и променливи. глобалните
Само сега, локални променливи могат са достъпни в рамките на функциите
в които те са създадени.
Те не могат да бъдат достъпни от всеки друг функция, която съществува във вашата програма,
само функцията на която тя е създадена.
Глобалните променливи, въз От друга страна, могат да бъдат достъпни
от всяка функция в програмата.
И причината за това е, защото те не са създадени вътре
на конкретна функция.
Ние ги декларира извън Всички функции,
означава, че всяка функция знае къде е то и да получите достъп и да го манипулират.
>> Досега в хода сте доста много работи изключително
с локални променливи.
Ето един пример за много, много проста основна функция и много прост
допълнителна функция, която сме написали.
В този случай, X, който Аз бях само оцветен в зелено
за да маркирате местоположението или приложното поле на тази променлива,
е местно към функцията тройна.
Основната не могат да се отнасят до х изобщо.
Той не знае какво е то.
Никоя друга функция, в действителност, ако ние имаше допълнителни функции в тук,
може да се отнася до х.
>> По същия начин, в резултат, който съм оцветен в синьо, е местно само към основното.
Само основният знае какво Резултатът е променлива.
тройна не могат да го използват.
>> Сега, както споменах, глобални променливи съществуват.
Ако декларирате, че променлива извън всяка функция,
всички функции в програма може да се отнасят към него.
Така че в този случай съм се подчертава в зелена глобална променлива декларация.
В този случай, променливи са декларирани
се нарича глобална, само за да бъдем пределно ясни за това.
Тя е от тип плувка.
И аз го присвоява стойност 0.5050.
>> Ще забележите, че в основното и по- тройна, аз съм в състояние да се отнася до глобалното.
И всъщност, ако отида чрез програмата както е посочено, основните първите разговори тройна,
тройни умножава глобалните с 3, които определя стойността си до 1.5-нещо,
1.51 или нещо подобно, и След това основният също отпечатва стойността
от световното.
Така че основният няма да разпечатате 0.5050 него, ще отпечата глобални пъти 3, 1.51.
Така че ще трябва да бъдете внимателни, когато можете да започнете работа с глобални променливи.
Докато те са много гъвкави в е в състояние да премине информация
около така че всеки функция може да го използва,
Тя също така може да има някои опасни последици
ако промените една функция стойността на променливата
преди да се очаква тя да бъде променена.
>> Защо това разграничение е от значение?
Защо ни е грижа дали някои променливи са местни, а други са глобални?
Е, за по-голямата част, локални променливи в C са това, което се нарича премина по стойност
когато правим извикване на функция.
Какво означава това?
>> Е, когато една променлива се предава от стойността, на callee, които
е друг начин да се каже на функцията че се получава променлива че
да се изпраща в като вход, тя всъщност не получава, че самата променлива.
Той ще получи своя собствена копие от него да се работи.
Това е много важно разграничение.
Ние просто видях преди една секунда че с глобални променливи,
ако ние манипулира глобалната променлива в една функция, ефектът
в който носи една функция чрез към всяка друга функция.
>> Но с локални променливи, това не е вярно.
Всяка функция, когато става получава променливи като вход
получават копия от тези променливи, не самите променливи.
Така че това, което е страничен ефект от това?
Това означава, че променливата в обаждащия се, че функцията
е осъществяване на повикването функция, е непроменена, ако не го отменят.
>> Например, в този код Foo не се променя изобщо.
Int Foo равнява 4, обадете тройна на Foo, вътре в тройната,
бихме могли да очакваме, че ще Foo се умножава по 3 и се връща,
но всъщност има никакъв ефект.
>> Тук обаче, много малка разлика.
Това наистина има ефект, което искаме.
Виждаш ли защо?
Ние сме императивни Foo в основната това време.
>> Така инт Foo равнява 4, Foo равнява тройна Foo, когато правим това повикване,
тройна получава собствен копие на Foo, своя собствена копие на 4.
Той казва върне 4 пъти 3 или каквито и да е променлива да се изпраща в 3 пъти.
И тогава ние присвоите връщането стойност на тройната да Foo отново.
Така че това всъщност ще презапише Foo.
Това е единственият начин да се направи това с локална променлива.
Така че сега, ако се добавят още ред код тук
в края на основната за разпечатате стойността на Foo,
тя в действителност ще отпечата 12.
>> Променлива обхват е по принцип Не твърде много на проблем
ако ли да назовете всичките си променливи различни неща.
Но той може да получи вид груба ако една и съща променлива име
появява в множество функции, което ще се случи много.
Ако някога се работи в реалния свят, където
се работи по съвместни програми и хора в различни отбори
работим заедно, за да напиша същото програма или на същия набор от програми,
те често ще използвате повторно променлива имена, особено често срещани
като х, у, И, Й, и така нататък.
>> Но когато имат променливи със същото име, въпроси обхват
може да се получи малко по-сложни, да прави разбор.
Например, знаете ли какво ще се отпечата
в края на тази програма?
Вземете една минута.
Пауза на видеото и прочетете чрез тази програма.
Можете да видите в горната WE има функцията декларация
за функция, наречена надбавка.
Тази функция приема единствен параметър, цяло число, което ние наричаме х.
И извежда цяло число.
Това е от типа връщане в началото.
>> Тогава ние имаме основна, няколко линии на код в основната, последният от които
е изявление на печат.
И не забравяйте, това е въпросът тук.
Какво всъщност ще бъде отпечатана в края на тази функция?
И тогава ние всъщност имат определение на нарастване долу.
>> Така че, отделете няколко минути, преминете през кода, следи нещата.
Знаеш ли какво ще бъде отпечатана в в края на тази програма?
>> Всичко е наред.
Надяваме се, че сте взели няколко секунди да се опита да направи разбор този един.
Да го направим заедно.
>> Така че аз съм зачеркнат нарастване на декларация на върха там.
Това е вид на отвличане на вниманието.
Това не е неговата собствена променлива.
Тя не разполага със собствен характер.
Това е просто една функция декларация, така че за целите на
да се опитва да прави разбор на това, което е случва в тази програма,
ние може и просто да го избегне.
>> Сега имаме в този случай, причина този проблем е сложно
е защото имаме локални променливи в както и основната увеличение, всеки от които
се нарича х.
И разбира същността на този въпрос е опитвайки се да разучат които х получава променено
и как тя се променя.
Така че аз съм оцветен всеки случай на х, който е местно към основното червено.
И аз съм оцветен всеки случай на х това е местна и прираста синьо.
>> Забележете, че в тази трета линия на главната, у равнява увеличение
х, че увеличение не се е Основната му премина х, или червената х.
Става все по-премина копие от него.
И това само ще работи с че копие от него, синият х.
Ако сте математически наклонена, може да се
вместо това си помисли за това като х суб м за главната и х суб аз за всяко нарастване.
Но това е една и съща идея.
х суб m, или червения Х в предишния слайд,
са променливите, които са local-- е инициатива на х-скоро, че
е местно към основното, и х суб аз, или сини променливи в предишния слайд,
са случаите на х, че са местни и прираста.
>> Така че, сте били в състояние да разбера какво тази функция отпечатва в края?
Аз съм Дъг Лойд, и това е CS50.