Променлива (програмиране)

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене
Представяне на референтни променливи в паметта

В програмирането променлива е място за съхранение на някаква стойност в оперативната памет на компютъра. Тя се обозначава от програмиста с име (идентификатор), обикновено на латиница. Тъй както дадена стойност с информация в един компютър може да бъде от даден вид (цяло число, дробно, буква, структура, обект и пр.), така и променливата, която я съдържа, се казва, че е от съответния тип: целочислена променлива, символна, обектна и т.н. Името на променливата сочи определена област в паметта, където се съдържа стойността ѝ. Това разделение на име и съдържание позволява името да се използва независимо от информацията, която представлява. Променливите могат да се пазят непосредствено в работната памет на програмата (стек) или в динамичната памет, в която се съхраняват по-големи обекти (символни низове и масиви). Примитивните типове данни (числа, char, bool) се наричат стойностни типове, защото пазят непосредствено своята стойност в стека на програмата. Референтните типове данни (стрингове, обекти и масиви) пазят адрес от динамичната памет, където е записана реалната им стойност. Те могат да се заделят и освобождават динамично, т.е. размерът им не е предварително фиксиран, както при стойностните типове. На идентификатора в кода може да се задава стойност, докато програмата се изпълнява. Но по време на нейното изпълнение, тази стойност може да се променя. Променливите могат да се използват в различни процеси: да зададат стойност на едно място, след това на друго, после могат да приемат нова стойност и тя да се използва на същите места, където е била използвана преди. Стойността на променливата може да се променя по време на изпълнението на програмата, докато името ѝ, нейния тип и мястото в паметта остават непроменени.

Променливите в програмирането най-често имат описателни имена, според това какво съдържат и как могат да бъдат използвани, за разлика от променливите в математиката, които обикновено се състоят от 1-2 символа. Когато искаме компилаторът да задели област в паметта за някаква информация, използвана в програмата ни, трябва да ѝ зададем име. Символите, които са разрешени са бувките a-z, A-Z, цифрите 0-9, както и символа '_'. Трябва да се съобразим и с това, че езиците за програмиране имат служебни думи и тях не можем да използваме. Името служи като идентификатор и позволява да се реферира нужната ни област от паметта. Когато декларираме променлива, извършваме следните действия:

- задаваме нейния тип (например int);

- задаваме нейното име (идентификатор, например age);

- можем да зададем начална стойност (например 25), но това не е задължително.

Синтаксисът за деклариране на променливи в C# и Java е следният:

<тип данни> <идентификатор> [= <инициализация>]

Ето един пример за деклариране на променливи:

string name;

int age;

Присвояването на стойност на променлива представлява задаване на стойност, която да бъде записана в нея. Тази операция се извършва чрез оператора за присвояване ‘=‘. От лявата страна на оператора се изписва име на променлива, а от дясната – новата ѝ стойност. Инициализация на променлива означава първото задаване на стойност.

Ето един пример за присвояване на стойност на променливи:

name = "Human";

age = 25;

В някои езици за програмиране дефинирането на променливи е малко по-разично. Например в JavaScript и PHP не се задава типа на данните, които се присвояват на променливата. Но в JavaScript се използва ключовата дума var, която се слага пред името. Може при декларирането да се зададе стойност, но може и на по-късен етап да се присвои такава. Пример:

var name = "Human";

var age;

age = 25;

В PHP специфичното е, че пред името на променливата се слага специалния знак $. Съответно декларирането изглежда по следния начин:

$age = 30;


Обхват[редактиране | edit source]

Добрите програми са разделени на малки части (наречени функции), както добрите разкази са разделени на глави, добрите глави са разделени на параграфи и т.н. Променливите, които са видими и са използвани в една функция, не са достъпни в други функции (части от програмата). Това ни помага да преизползваме имена на променливи. Например ‘age’ в една функция може да се използва за години на ученик, а в друга - за години на добро вино. Също така това ни предпазва от възможността да променим стойността на дадена променлива инцидентно и тя да бъде използвана грешно в друга част от програмата.

Обхватът и времето на живот са свързани. Обхвата на променливата влияе върху времето на нейния живот.

Обхватът описва къде в текста на програмата променливата може да се използва, а времето на живот описва кога през времето на изпълнение на програмата тя има стойност.

Повечето езици за програмиране дефинират специфичен обхват за всяка променлива, който може да варира в рамките на една и съща програма. Обхватът е част от програмен код, за който името на променливата има смисъл и за който казваме, че тя е видима. Влизането в този обхват обикновено се свърза с началото на живота на дадената променлива, а излизането от обхвата е краят на нейния живот. Например променлива с лексикален обхват има смисъл само в рамките на определена функция/подпрограма или казано по-прецизно в рамките на блок от изрази; това е статична резолюция, която се извършва по време на разбора на програмата или по време на компилирането ѝ. От друга страна променлива с динамичен обхват се определя по време на изпълнение на програмата, базирано на глобалния стек. Променливи, които са достъпни само в рамките на определена функция, са наричани локални. Глобалните променливи са достъпни навсякъде в програмата.

Ако програмният език не поддържа система за почистване на паметта(garbage collection), променлива, чийто живот преминава постоянно обхвата, може да доведе до липса на памет, тъй като паметта, заделена за нея може никога да не бъде освободена. Въпреки че може и да е разрешено променлива да преминава нейния обхват, както е например в Lisp и при локалните статични променливи в C, когато изпълнението се връща обратно в обхвата на променливата, тя може още веднъж да бъде използвана. Променлива, чийто обхват започва преди нейното време на живот, се нарича неинициализирана и често има недефинирана, случайна стойност, при опит за използване, освен ако не ѝ е дадена експлицитно определена стойност. Променлива, чийто живот приключва преди нейния обхват, може да се превърне във висящ указател и да бъде неинициализирана, въпреки че нейната стойност е била вече унищожена. В повечето езици за програмиране, ако се опитаме да използваме променлива, от описаните два случая, ще се върне грешка. В други езици обаче, това може да доведе до непредвидими резултати. Въпреки това на такива променливи може да бъде дадена нова стойност, която да поднови живота им.

За по-добра ефективност на паметта, паметта нужна за променливата може да бъде заделена, когато тя се използва за първи път, и да бъде освободена, когато вече не се използва. Възможно е да се дефинира променлива, за която да се задели памет, но по-късно в програмата тя да не се използва. За да се предотврати такава загуба на памет, компилаторите често предупреждават програмистите, че има променливи, които са дефинирани, но не са използвани.

Счита се за добра практика обхватът на една променлива да е възможно най-малък. По този начин се избягва възможността различни части от програмата по погрешка да променят едни други променливите си.

Променлива на инстанция[редактиране | edit source]

В програмирането класът описва обект от реалния свят. А за да се опишат характеристиките на този обект, се използват специален тип променливи, наречени полета. Когато тези полета придобият стойности за даден обект, то по тях той се отличава от всички останали обекти от същия клас. Тези полета също така се наричат „променливи на инстацията, също така и „член-променливи на класа“. Те се декларират в тялото на класа, но извън неговите методи, конструктори и блокове. Пример:

class Dog

{

int age;

string[] names;

}

Полетата се декларират по същия начин, описан по-горе за обикновена локална променлива. Заедно с декларирането е възможна и инициализация:

<тип данни> <идентификатор> [= <инициализация>];

Обхвата на тези член-променливи е от тяхното деклариране до затварящата скоба на класа.

Статична променлива[редактиране | edit source]

Съществуват и полета, които се наричат статични променливи. Те са общи за всички обекти от даден клас. Тяхната декларация изисква поставянето на специалната дума static пред типа на обекта:

static <тип данни> <идентификатор> [= <инициализация>];

Пример за деклариране на статична променлива в клас:

class Dog

{

static int dogCount;

int age;

string[] names;

}

Казва се, че статичните полета са асоциирани с класа, вместо с който и да е обект от този клас, т.е. стойността им е еднаква за всички инстанции на класа.

Източници[редактиране | edit source]