Automatická proměnná
Automatická proměnná je v počítačovém programování proměnná, která je alokována nebo uvolňována automaticky až v okamžiku, kdy se vstoupí nebo vystoupí z jejího kontextu. Kontextem je myšlen především lexikální rozsah platnosti proměnných, kde platnost:
- identifikátoru z externí definice je od místa jeho definice do konce zdrojového souboru s touto definicí.
- formálních parametrů funkce končí s koncem těla funkce.
- identifikátorů, deklarovaných v bloku, končí s koncem tohoto bloku.
- návěští je tělo funkce, v němž je uvedeno.
Proměnná, která je deklarovaná z vnějšku, se uvnitř volané funkce v rámci kontextu pohybuje mimo rozsah platnosti (tzn. je nepřístupná volané funkci). Do rozsahu se dostane až po návratu z této funkce.
Termín lokální proměnná je obvykle synonymem pro automatické proměnné, protože se jedná o totéž v mnoha programovacích jazycích. Lokální proměnná je však obecnější. Kromě automatických lokálních proměnných totiž existují i statické lokální proměnné. Statická lokální proměnná je viditelná jen ve funkci, kde je definována. Paměť pro takovou proměnnou je alokována při spuštění dané funkce a uvolněna je až po skončení programu. Z toho vyplývá, že, máme-li statickou proměnnou a opustíme blok, ve kterém byla definována, tato proměnná nezaniká, pouze již není viditelná (ponechává si svou hodnotu mezi jednotlivými voláními funkce).
Automatická proměnná může být alokovaná v zásobníku (v rámci procedury, kde je deklarovaná), což je užitečné pro rekurzivní a reentrantní funkce (tj. pro funkce, které mohou být bezpečně volány v paralelním prostředí).
V konkrétních programovacích jazycích
C, C++
(Nazývány jako automatické proměnné.)
Všechny proměnné deklarované uvnitř bloku kódu jsou automatické již ve výchozím nastavení, ale mohou být dodatečně určeny klíčovým slovem auto
. Tím je totiž překladač nucen, aby proměnné ponechal v zásobníku. Neinicializovaná automatická proměnná obsahuje nedefinovanou hodnotu dokud jí není přiřazena nějaká jiná validní hodnota. Použitím klíčového slova register
se kompilátoru naznačuje umístění proměnné do registru procesoru. Pro tyto proměnné nelze zjišťovat hodnoty adres a tedy nelze používat ukazatele.
Příklad, kdy je rozsah platnosti lokální proměnné narušen, demonstruje následující příklad:
for(auto int i=0;i<10;i++)
{
//nejaky kod
for(auto int i=0;i<-10;i--) //chyba, promenna i jiz nemuze byt deklarovana v tomto rozsahu platnosti
{
//nejaky kod
}
}
Samostatný cyklus je chápán jako blok kódu. Protože je v jednom cyklu vnořený další cyklus – sdílí společný rozsah platnosti proměnné a proto nemůže být vytvořena stejnojmenná proměnná i.
Java
(Nazývány jako lokální proměnné.)
Podobně jako v C/C++, jen tu nejsou definovány klíčová slova auto
a register
. Na rozdíl od C/C++ zde nejsou podporovány implicitní inicializace pro lokální proměnné a kompilátor vyhodí chybu (oproti C/C++, kde kompilátor jen upozorní na neinicializovanou proměnnou). Pro proměnné, které představují datové položky třídy, implicitní inicializace funguje (0 pro čísla a null
pro objekty).
Perl
(Nazývány jako lexikální nebo privátní proměnné.)
V Perl jsou lokální proměnné deklarovány pomocí klíčového slova my
. Skaláry, které jsou neinicializované, mají výchozí hodnotu UNDEF
. Neinicializované pole nebo hash mají hodnotu ()
.
Perl nemá automatickou lokální proměnnou, ale poskytuje globální proměnnou s dočasnou hodnotou, které je dynamicky přidělován rozsah platnosti do ostatních bloků kódu.
Reference
V tomto článku byl použit překlad textu z článku Automatic variable na anglické Wikipedii.