Лекции по увод в програмирането



страница11/16
Дата25.07.2016
Размер0.96 Mb.
#5224
ТипЛекции
1   ...   8   9   10   11   12   13   14   15   16

21 ноември

20. Области на действие на променливите.


В тялото на една функция могат да бъдат дефинирани вътрешни променливи; те са определени само в тялото на конкретната функция и това е тяхната област на действие (област на видимост);

в C обезателно дефинирането трябва да е в началото на тялото на функцията;

в C++ това може да става на произволно място, където може да има израз;

областта на видимост започва от мястото, където е дефинирана променливата и продължава до края на функцията;



една програма на C е съвкупност от функции; между тях и преди тях може да се дефинират променливи; те се наричат външни и са определени само за тези функции, които са записани след тяхното дефиниране; с помощта на външните променливи може да се обменят данни между функциите; един друг начин за това е механизмът с формалните и фактическите параметри; той е основен и е за предпочитане, тъй като с него се постигат по-ясни и разбираеми програми, въпреки че използването на външни променливи е по-ефективно, тъй като не изисква заместване; имената на външните променливи трябва да са уникални в програмата; ако в дадена функция се среща вътрешна променлива с име, което съвпада с това на външна променлива, то във функцията може да се използва само вътрешната променлива;
Пример:
float x, y;

void main ()

{ int k; … }

void fun1 ()

{ int x; … }

float z;


void fun2 ()

{ int y; … }


външните променливи x и y имат област на действие цялата програма (въпреки че не могат да се ползват навсякъде);

външната променлива z има област на действие само последната функция;

във функция main могат да се използват външните променливи x, y и вътрешната променлива k; областта на действие на k свършва в края на функцията;

във функция fun1 могат да се използват външнaта променлива y и вътрешната променлива x, която скрива външната променлива x;

във функция fun2 могат да се използват външните променлива x и z и вътрешната променлива y, която скрива външната променлива y;
Конструкцията блок има специално отношение към областта на действие на променливите; блок е последователност от описания и оператори, заключени във фигурни скоби ({ }); тялото на една функция е блок, но в тялото на функцията може да има други блокове; те се наричат вложени; в блоковете могат да се дефинират променливи;

в C обезателно това трябва да става в началото на блока;

в C++ това може да става на произволно място в блока;

променливите, които са дефинирани в даден блок са локални за този блок и глобални по отношение на всички вложени блокове в блока; възможно е съвпадане на имена между локални и глобални променливи; в такъв случай името на локалната променлива скрива името на глобалната променлива;

вътрешните променливи се делят на глобални и локални по отношение на вложените блокове във функцията; външните променливи са един тип - те са глобални по отношение на функциите в програмата;


Пример:
void main ()

{ float x, y;

{ int k; … }

{ int x; … }

{ float z;

{ int y; …}

}

}
променливите x и y са локални за функцията main, въпреки че не могат да се използват навсякъде;



променливите x и y са глобални за първи блок, а променливата k е локална за него;

променливата y е глобална за втори блок, а променливата x е локална за него и тя скрива глобалната променлива x;

в третия блок z е локална променлива, а x и y са глобални;

в четвъртия блок, който е вложен на третия, могат да се използват глобалните променливи x и z и локалната променлива y, която скрива глобалната променлива y;


два блока могат да бъдат или вложени или паралелни, т.е. или изцяло са вложени или нямат сечение;
21. Класове памет.
Всяка променлива се характеризира с три атрибута – тип, област на действие и период на активност;

типът на променливата определя колко байта памет заема тя и по какъв начин тя се кодира в тези байтове; вследствие получаваме множеството от допустими стойности на променливата;

областта на действие се определя от точното място, където е дефинирана променливата;

под период на активност се разбира частта от времето при изпълнението на програмата, през която се съхранява последната текуща стойност на променливата; периодът на активност е равен или на времето за изпълнение на цялата програма или на времето, през което управлението се намира в областта на нейното действие;

в зависимост от периода на активност за променливите се разпределя памет на различни места или още се казва, че променливите имат различен клас памет;

в езика C се различават четири класа памет:



    • extern

    • auto

    • static

    • register

класът памет се задава в дефиницията на променливата;

Синтаксис:

клас_памет тип име
тук клас_памет може да бъде auto, static, register;
структура на частта от паметта, която е разпределена за една потребителка програма на машинен език;




п
посока на растене на адресите
рограмен стек

д
връх на стека
инамични данни и свободна памет

статични данни

изпълним код

програмният стек заема и освобождава памет – ако влизат или излизат данни в него върхът се измества;

областта за статични данни се разпределя в началото на изпълнението на програмата и се освобождава в края на изпълнението на програмата;
в зависимост от това какъв клас памет е една променлива за нея се разпределя памет в различна област;
клас памет extern не се посочва явно при дефинирането на променливите; по подразбиране клас памет extern имат външните променливи; за тях памет се разпределя в областта за статични данни;
клас памет auto е предназначен за вътрешните променливи и за формалните параметри на функциите; променливите от този клас се наричат автоматични; за тях се разпределя памет в програмния стек и това става по време на изпълнение на програмата след влизане във функцията или блока, в който те са дефинирани и когато управлението за първи път достигне точното място на дефинирането; поради това в началото автоматичните променливи имат неопределена стойност; техният период на активност съвпада с областта им на действие, т.е. стойностите им се пазят само докато се изпълнява функцията или блока, в който са дефинирани; при повторно влизане в блока или функцията, стойностите им отново са неопределени; по подразбиране при дефинирането на една вътрешна променлива тя е от клас auto (дори когато не е указано точно);
клас памет static трябва явно да се задава при дефиницията на една променлива; за променливи от този клас се разпределя памет в областта за статичните данни; ако една вътрешна променлива е дефинирана от клас static, нейният период на активност става времето за изпълнение на цялата програма; повечето компилатори анулират областта за статичните данни в началото на програмата; това не се отнася за програмния стек – областта на автоматичните променливи и затова тяхната стойност е неопределена в момента, когато за тях се разпредели памет; ако една външна променлива е дефинирана със static смисълът е друг – това означава, че тя не може да се използва в други модули;
клас памет register е частен случай на клас памет auto; ако в програмата има променлива, която се използва много често (например в даден цикъл), възможно е за нея да се разпредели

по-бърза памет (регистър на централния процесор) и по този начин се засилва ефективността на програмата; оптимизиращите компилатори правят това автоматично – те сами определят кои променливи се използват често и разпределят памет в регистрите на процесора;

Пример:
void fun ()

{ static int i;

float z;

i = i + 2;

z = 2;

}
понеже i е от клас памет static, за нея компилаторът разпределя памет в областта за статичните данни; затова тя в началото има стойност 0; при първото обръщение към функцията i ще стане 2 и след излизане от функцията паметта за i няма да се освободи



(тя е static), макар че ние не можем да я използваме извън функцията, тъй като тя е вътрешна променлива; при повторно извикване на функцията стойността на i е запазена и след приключване на изпълнението тя ще има стойност 4 и т.н.;
за променливата z се разпределя памет в програмния стек и при изпълнението на функцията тя получава неопределена стойност; непосредствено преди края на изпълнението тя има стойност 2, но когато изпълнението приключи, паметта за z се освобождава (тя е в стека); при повторно обръщение за z отново ще се разпредели памет в стека (в общия случай на друго място) и стойността и отново ще е неопределена;
когато в дефинирането на една променлива сме записали само класа памет, но сме пропуснали типа, тогава той се подразбира като int;

например: static i, auto i и т.н.;






Сподели с приятели:
1   ...   8   9   10   11   12   13   14   15   16




©obuch.info 2024
отнасят до администрацията

    Начална страница