[Powered by Google Translate] Дейвид DICIURCIO: Значи важно понятие, за да се разбере в
програмиране е идеята на обхвата.
Обхват може да бъде определена в зависимост от контекста, в който дадена променлива е
видими или достъпни.
Например, нека кажем, че имаме функция, основен, че е
би трябвало да се увеличи стойността на променлива, X, 1-2.
Както можем да видим, основно инициализира X към едно, отпечатва
някакъв текст и след това използва функцията увеличение, преди
отпечатате по-дълъг текст.
Ако тази функция да работи коректно, тя би
отпечатате х 2.
Нека да опитаме.
>> Така че, както можете да видите, основно не правим това, което се очаква да.
Тя връща стойност 1, а
от 2 очаквахме.
Причината за този бъг може да се обясни по обхват.
Във функцията, основен, инициализира х
само в рамките на функция.
С други думи, на променливата х е обявен на местно ниво в
функция, основен и не е достъпна
извън нея.
Само Основната да получите достъп до х в тази ситуация.
Когато ние наричаме увеличение, ние не мине х като вход, но
просто копие на х.
В резултат на това, функцията за увеличение само добавя
стойност 1 копие на стойността на х.
Но не да се х.
Когато се върнете на главната, X не се е променила изобщо.
Така отпечатване х ще доведат до стойността на 1.
>> Е, тогава, който оставя въпроса: как трябва да се определи
тази функция?
Едно от решенията е увеличение връща стойност.
По този начин, функцията увеличение
да ни даде цяло число.
Така че тук е нашата преразгледания код с
заместник нарастване функция.
Ето, ние, вместо да се връща х + 1, а не само края
с х е равна на х + 1.
Също така, да забележите, че ние заменя на изхода на
инкрементиране, преди невалидни, с вътр, в който се посочва, че
увеличение сега ще премине отново целочислена стойност.
Сега, след инкрементирането писти, ще се върне със стойност
2, точно така, както е предвидено.
>> Друга ситуация, която демонстрира значението обхвата
е в scopeloop.c.
В този кодекс, ние имаме за цикъл, в който променливата
общо се инициализира по време на всяка стъпка.
За съжаление, този код не се компилира.
Това е така, защото от променливата обща сума всъщност не съществува
извън за контур.
Променливите, декларирани в рамките на вериги, съществува само в рамките на
контур и е демонстрирана в наша грешка
съобщение, общо необозначено.
Променливата обща сума все още предстои да бъде обявена в рамките на обхвата
на основната функция.
Освен това, по време на всяко повторение на нашата линия,
са reinitializing общо 0.
Това само по себе си не се поддържа кода от съставянето, но това
би попречило общо от всякога сумиране на стойност миналото 1.
>> Отново, това, което е най-добрият начин да се определи това?
Един от най-лесно методи включва общо местно до
функция, основен, а не до самата линия.
Това ще възлезе на действително нарастване и в крайна сметка
позволи да бъдат отпечатани, след като за цикъла.
Друга техника, която ще обобщи накратко
бъде използването на глобалните променливи.
Глобалните променливи са променливи, които са обявени преди основните
, които поддържат тяхната стойност рамките на цялата програма.
Разбира се, функции може да промени стойността на глобален,
но те не трябва да излизат извън обхвата като локални променливи.
Въпреки това, като се използват глобални променливи има тенденция да се намръщи
като лош дизайн, тъй като има по-добри начини за
споделяне на данни между функции.
Например, като се използват указатели.
Но повече за това друг път.
>> В крайна сметка, важно е да има разбиране на обхвата
в контекста на паметта на компютъра, или RAM.
Когато се изпълнява програма, локални променливи и функции
се добавят към определено място в
RAM нарича стека.
Като функции връщат рамките на стаковете на променливите са
отстранява ефективно от стека, освобождавайки повече памет.
Така че, когато се преразглежда обхвата, уверете се, че си спомняте тези три
ключови точки.
Едно, обхват може да бъде местно или глобално.
Тя зависи от това къде е декларирана променливата.
Две, променливи декларирани или инициализирана функции
местно до тази функция и не могат да бъдат променяни от други
функции, поне не без да се използва указатели.
И накрая, променливи също са местно, така и на повторения, които са
декларирани в рамките.
Променливи, които не са достъпни
извън цикъла.
>> Това е всичко за сега относно обхвата.
Благодаря за гледане.