Zmienna (informatyka): Różnice pomiędzy wersjami

[wersja przejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
Wycofano ostatnią zmianę treści (wprowadzoną przez 37.248.163.18) i przywrócono wersję 52620749 autorstwa Ignasiak
drobne redakcyjne
Linia 1:
{{inne znaczenia|informatyki|[[zmienna|inne znaczenia]]}}
 
'''Zmienna''' - konstrukcja [[programowanie|programistyczna]] posiadająca trzy podstawowe atrybuty: symboliczną [[Nazwa własna|nazwę]], miejsce przechowywania i wartość; pozwalająca w [[Kod źródłowy|kodzie źródłowym]] odwoływać się przy pomocy nazwy do wartości lub miejsca przechowywania. Nazwa służy do identyfikowania zmiennej w związku z tym często nazywana jest [[Identyfikator (programowanie)|identyfikatorem]]. Miejsce przechowywania przeważnie znajduje się w [[Pamięć operacyjna|pamięci]] komputera i określane jest przez [[Adres pamięci|adres]] i długość danych. Wartość to zawartość miejsca przechowywania. Zmienna zazwyczaj posiada również czwarty atrybut: typ, określający rodzaj danych przechowywanych w zmiennej i co za tym idzie sposób reprezentacji wartości w miejscu przechowywania. W programie wartość zmiennej może być odczytywana lub [[Przypisanie|zastępowana nową wartością]], tak więc wartość zmiennej może zmieniać się w trakcie wykonywania programu, natomiast dwa pierwsze atrybuty (nazwa i miejsce przechowywania) nie zmieniają się w trakcie istnienia zmiennej{{odn|Ben-Ari|1996}}. W zależności od rodzaju języka typ może być stały lub zmienny. Konstrukcją podobną lecz nie pozwalającą na modyfikowanie wartości jest [[stała (informatyka)|stała]].
 
Inaczej wygląda zmienna w [[programowanie funkcyjne|programowaniu funkcyjnym]] (gdzie idea zmiennej jest zbliżona do [[zmienna (matematyka)|zmiennej matematycznej]]). Podczas wchodzenia obliczeń do [[kontekst]]u, w którym zmienna jest związana, jest jej nadawana wartość, która nie zmienia się, aż do opuszczenia kontekstu. Jednak przy ponownym wejściu w ten kontekst, zmiennej może być przypisana inna wartość niż poprzednio.
Linia 8:
 
== Typ zmiennej ==
W językach ze [[typowanie statyczne|statycznym typowaniem]] zmienna ma określony [[typ danych]], jakie może przechowywać. Jest on wykorzystywany do określenia reprezentacji wartości w pamięci, kontrolowania poprawności operacji wykonywanych na zmiennej (kontrola typów) oraz [[konwersja typu|konwersji]] danych jednego typu na inny.
 
W językach z [[typowanie dynamiczne|typowaniem dynamicznym]] typ nie jest atrybutem zmiennej lecz wartości w niej przechowywanej. Zmienna może wtedy w różnych momentach pracy programu przechowywać dane innego typu.
Linia 16:
 
== Zasięg, czas życia, widoczność ==
[[Zasięg (programowanie)|Zasięg zmiennej]] określa, gdzie w treści programu zmienna może być wykorzystana, natomiast czas życia zmiennej to okresy w trakcie wykonywania programu, gdy zmienna ma przydzieloną pamięć i posiada (niekoniecznie określoną) wartość. Precyzyjnie zasięg odnosi się do nazwy zmiennej i przeważnie jest aspektem leksykalnym, natomiast czas życia do zmiennej samej w sobie i związany jest z wykonywaniem programu. Ze względu na zasięg można wyróżnić podstawowe typy zmiennych:
* [[Zmienna globalna|globalne]] - obejmujące zasięgiem cały program,
Ze względu na zasięg można wyróżnić podstawowe typy zmiennych:
* [[zmienna lokalna|lokalne]] - o zasięgu obejmującym pewien blok, podprogram. W językach obsługujących [[rekurencja|rekurencję]] zazwyczaj są to zmienne automatyczne, natomiast w językach bez rekurencji mogą być statyczne.
* [[Zmienna globalna|globalne]] - obejmujące zasięgiem cały program,
Zmienne zadeklarowane w [[moduł (informatyka)|module]] mogą być zmiennymi prywatnymi modułu - dostępnedostępnymi wyłącznie z jego wnętrza lub zmiennymi publicznymi (eksportowanymi) dostępnymi tam, gdzie moduł jest wykorzystywany. Podobnie jest ze zmiennymi w [[klasa (programowanie obiektowe)|klasie]] – mogą być dostępne:
* [[zmienna lokalna|lokalne]] - o zasięgu obejmującym pewien blok, podprogram. W językach obsługujących [[rekurencja|rekurencję]] zazwyczaj są to zmienne automatyczne, natomiast w językach bez rekurencji mogą być statyczne.
Zmienne zadeklarowane w [[moduł (informatyka)|module]] mogą być zmiennymi prywatnymi modułu - dostępne wyłącznie z jego wnętrza lub zmiennymi publicznymi (eksportowanymi) dostępnymi tam gdzie moduł jest wykorzystywany.
Podobnie ze zmiennymi w [[klasa (programowanie obiektowe)|klasie]] mogą być dostępne:
* tylko dla danej klasy (zmienna prywatna),
* dla danej klasy i jej [[Dziedziczenie (programowanie)|potomków]] (zmienna chroniona),
* w całym programie (zmienna publiczna),
* inne ograniczenia w zależności od języka (np. friend czy internal w .net).
Zmienne mogą zmieniać swój pierwotny zasięg np. poprzez importowanie/włącznie do zasięgu globalnego modułów, pakietów czy przestrzeni nazw.
 
Ze względu na czas życia i sposób alokacji zmienna może być:
* Statyczna - gdy pamięć dla niej rezerwowana jest w momencie ładowania programu; takimi zmiennymi są zmienne globalne, zmienne statyczne w klasie (współdzielone przez wszystkie obiekty klasy, a nawet dostępne spoza klasy), statyczne zmienne lokalne funkcji (współdzielone pomiędzy poszczególnymi wywołaniami funkcji i zachowujące wartość po zakończeniu).
* Automatyczna, dynamiczna - gdy pamięć przydzielana jest w trakcie działania programu ale automatycznie. Są to przeważnie zmienne lokalne podprogramów i ich parametry formalne. Przeważnie alokowane na stosie w rekordzie aktywacji, znikają po zakończeniu podprogramu.
* Dynamiczna - alokowanie ręcznie w trakcie wykonywania programu przy pomocy specjalnych konstrukcji lub funkcji (malloc, new). W zależności od języka zwalnianie pamięci może być ręczne lub automatyczne. Zazwyczaj nie posiada własnej nazwy, lecz odwoływać się do niej trzeba przy pomocy wskaźnika, referencji lub zmiennej o semantyce referencyjnej.
 
W większości współczesnych języków zasięg jest statyczny (leksykalny) oznacza to podprogram ma dostęp do zmiennych lokalnych bloków w których jest zdeklarowany. Przykładowo
Linia 43 ⟶ 41:
}
</syntaxhighlight>
Funkcja ''g'' jest zadeklarowana wewnątrz funkcji ''f'', w związku z tym ma dostęp do zmiennej lokalnej funkcji ''f'' - ''a''. W niektórych językach (np. pierwsze implementacje LISPu) zasięg był dynamiczny, czyli nie było ważne gdzie funkcja jest zadeklarowana, tylko jaka funkcja ją wywołała. W poniższym przykładzie funkcja g wydrukuje zawartość zmiennej a z funkcji f.
W niektórych językach (np. pierwsze implementacje LISPu) zasięg był dynamiczny, czyli nie było ważne gdzie funkcja jest zadeklarowana, tylko jaka funkcja ją wywołała.
W poniższym przykładzie funkcja g wydrukuje zawartość zmiennej a z funkcji f.
<syntaxhighlight lang="c">
int g () {