Przypisanie
Przypisanie (podstawienie) – informatyczna operacja nadania, umieszczenia, wpisania do określonej l-wartości nowej wartości.
Rodzaje przypisania
Przypisanie może zostać dokonane:
- instrukcją przypisania
- operatorem przypisania
- innym operatorem
- w inicjalizacji zmiennej
- w wywołaniu podprogramu
- w wyniku efektów ubocznych
- w wyniku przypisania do innej l-wartości, zajmującej ten sam obszar, lub część tego samego obszaru, pamięci
- w instrukcji wejścia
Instrukcja przypisania
Osobny artykuł: Instrukcja przypisania.
To jedna z podstawowych instrukcji prostych występujących w językach programowania. Zwykle nie zawiera taka instrukcja słowa kluczowego, choć istnieją języki programowania wymagające lub zezwalające opcjonalnie na użycie słowa kluczowego. Typowa składania takiej instrukcji ma postać:
l-wartość symbol_przypisania wyrażenie [terminator]
W najprostszym przypadku l-wartość jest identyfikatorem zmiennej lub wskaźnikiem.
W pewnych językach wymagane może być poprzedzenie instrukcji przypisania słowem kluczowym, w nowych implementacjach słowo takie zwykle jest opcjonalne, np. Basic:
10 LET A=1
Operator przypisania
Operator przypisania to operator, który:
- powoduje przypisanie, i
- zwraca wartość równą wartości przypisanej do l-wartości.
Operator przypisania może wystąpić w instrukcji przypisania ale może także wystąpić wewnątrz wyrażeń, tak jak każdy inny operator, gdyż w przeciwieństwie do instrukcji posiada tę właściwość, że zwraca określony rezultat. Taka konstrukcja występuje w językach, w których każda konstrukcja może być traktowana jak wyrażenie zwracające wartość (np. Icon, Algol 68), lub jako operator w pozostałych językach (np. C).
Inne operatory powodujące przypisanie
Inne operatory powodujące przypisanie:
- inkrementacja (np. w języku C operator
++
) - dekrementacja (np. w języku C operator
--
) - operator wymiany wartości (np. Icon operator
:=:
).
Np. w języku C instrukcja: i++;
spowoduje zwiększenie wartości zmiennej i
o jeden, a więc przypisanie do l-wartości i
nowej wartości równej i+1
.
Inicjalizacja zmiennej
Osobny artykuł: Inicjalizacja zmiennej.
Inicjalizacja zmiennej może nastąpić w wielu punktach kodu, zależnie od możliwości danego języka i przyjętego przez programistę rozwiązania. Wczesna inicjalizacja – w deklaracji zmiennej – jest najlepsza metodą uniknięcia błędów polegających na odwołaniu do zmiennych niezainicjowanych tzn. takich którym nie przypisano jeszcze konkretnej, sensownej wartości.
Wywołanie podprogramu
Osobny artykuł: Instrukcja wywołania.
Osobny artykuł: Argument (informatyka).
Przy wywołaniu podprogramu, a więc
- w instrukcji wywołania, lub
- przy wywołaniu funkcji w wyrażeniu
w podprogramach w których występują parametry formalne, przed wykonaniem instrukcji zawartych w ciele podprogramu, następuje przypisanie do tych paramentów nowych wartości równych wartościom argumentów, wyspecyfikowanych w wywołaniu podprogramu. Sposób przypisania zależny jest od przyjętych metod kojarzenia argumentów z parametrami.
Efekty uboczne
Ten rodzaj przypisania występuje np. w podprogramie, w którym następuje przypisanie wartości do zmiennej globalnej. Wykorzystywanie efektów ubocznych jest krytykowane w literaturze przedmiotu jako prowadzące do błędów. W kodzie źródłowym bowiem takie przypisanie jest niewidoczne. Wymaga więc odwołania się do kodu podprogramu, który może być niedostępny (np. podprogramy biblioteczne).
Przypisanie do innej l-wartości
Takie przypisanie następuje:
- w uniach,
- w rekordach z wariantami do pól wariantowych,
- w zmiennych nakładanych (np. dyrektywa absolute w Turbo Pascalu),
- we wskaźnikach na ten sam obszar (adres).
Szczególnie posługiwanie się dwoma ostatnimi konstrukcjami, również wymaga szczególnej ostrożności i staranności, gdyż również może prowadzić do błędów lub nieprzewidzianych efektów i wyników.
{ Przykład w Turbo Pascalu } var s : string; len : byte absolute s; ... s:='Turbo Pascal'; writeln(s); { wyprowadzenie napisu 'Turbo Pascal' } len:=5; { przypisanie do zmiennej nakładanej len na 1 bajt zmiennej s zawierający długość łańcucha } writeln(s); { wyprowadzenie napisu 'Turbo' } ...
Przypisanie w instrukcji wejścia
Instrukcje wejścia-wyjścia służą do komunikacji programu, procesu z otoczeniem. Instrukcja wejścia, która pobiera dane z otoczenia (np. urządzeń wejścia, plików itd.) musi pobrane dane zapamiętać w określonej lokacji, czyli dokonać przypisania do wskazanej w tej instrukcji l-wartości.
Typy przypisań
Ze względu na duże znaczenie przypisania w programowaniu w niektórych językach istnieją specjalne konstrukcje przypisania, ułatwiające kodowanie złożonych operacji przypisania. Do konstrukcji takich można zaliczyć przypisania wielokrotne, przypisania strukturalne i inne. Można więc wyróżnić:
- przypisanie proste
- przypisanie wielokrotne.
Przypisanie proste jest omówione wyżej. Przypisanie wielokrotne to zapis w jednym przypisaniu wielu przypisań:
- l-w1, l-w2, … l-w_n = wyrażenie
- wszystkim l-wyrażeniom od 1 do n zostanie przypisana wartość wyrażenia, co jest równoważne zapisowi:
- l-w1 = l-w2 = … l-w_n = wyrażenie
- taka konstrukcja jest dostępna w tych językach w których występuje operator przypisania,
- l-w1, l-w2, … l-w_n = w1, w2, … w_n
- co jest równoważne l-w1=w1, l-w2=w2, …, l-w_n=w_n, konkretna implementacja musi określać interpretację takiego zapisu, w którym obie listy będą różnej długości, co może być, ale nie musi, interpretowane jako błąd.
Przykładowo w języku PL/I dostępna jest instrukcja przypisania:
l-w1, l-w2, … l-w_n = wyrażenie;
która jest równoważna instrukcji Algolu 68:
l-w1 := l-w2 := … l-w_n := wyrażenie;
Odrębnym zagadnieniem są przypisania strukturalne, tzn. przypisania tablicowe, w których poszczególne elementy jednej tablicy otrzymują wartość odpowiadających elementom innej tablicy, oraz przypisania strukturowe, w których odpowiednim polom jednej struktury (rekordu) przypisane zostają wartości innej struktury. Różne rozwiązania mogą stawiać wymogi co do zgodności reprezentacji pamięciowej poszczególnych pól, lub zgodności nazw (identyfikatorów) pól.
Specyficzne formy przypisania
Specyfika niektórych języków programowania, których założenia i składnia odbiegają do większości uniwersalnych języków sprawia, że zapis przypisania odbiega znacząco od przypisania w typowych językach.
Forth
Przypisanie w języku Forth ma postać:
wyrażenie l-wartość <! | C! >
Powyższy zapis wynika z prostej zasady tego języka, według której wszystkie operacje pobierają argumenty ze stosu. Wyrażenie (dowolnie rozbudowane) i l-wartość, która na stosie ma postać adresu (i również może być dowolnie rozbudowanym wyrażeniem) umieszczane są na stosie, a operatory powodują przypisanie danej do odpowiedniego adresu. l-wartość może być identyfikatorem zmiennej lecz działanie będzie identyczne: identyfikator zostanie zinterpretowany jako operacja umieszczenia na stosie adresu zmiennej. W tym języku można więc l-wyrażenie wyrazić za pomocą, np. literału liczbowego, pod warunkiem, że literał ten będzie reprezentował poprawny adres, co w typowych językach jest w uogólnieniu niedopuszczalne.
Lisp
W językach opartych na języku Lisp, operuje się listami, a więc i przypisanie realizowane jest przez listę. Przypisanie może więc mieć postać:
(setq l-wyrażenie wyrażenie)
przy czym oba argumenty mogą być również listami.
Smalltalk
W języku Smalltalk (uznawanym za najbardziej obiektowy język programowania) wszystko jest obiektem. Przypisanie jako takie więc realizowane jest przypisanie do pewnej wartości (stanowiącej obiekt) nowej właściwości, stanowiącej l-wartość
l-wartość <- wartość
Cobol
Język Cobol projektowany był głównie do przetwarzania danych administracyjnych, finansowych itp., co znalazło swoje odzwierciedlenie w składni, która miała przypominać język naturalny (angielski). Sąd przypisanie może mieć formę:
MOVE wyrażenie TO l-wartość
Dopuszczalna jest jednak także forma typowa dla języków programowania:
COMPUTE l-wartość=wyrażenie
Symbole przypisania
Przypisanie w kodzie źródłowym reprezentowane jest w pewnych kontekstach (instrukcja przypisania, operator przypisania), przez odpowiedni symbol/symbole zdefiniowane przez składnię rozpatrywanego języka programowania.
Podział symboli
Symbole przypisania można podzielić na:
- proste, np.
=
,:=
, - złożone, np.
+=
,**:=
.
Proste symbole realizują operację przypisania. Symbole złożone reprezentują określone działanie, przeważnie operator, i przypisanie, typowy symbol złożony ma składnię:
l-wartość operator= wyrażenie
Działanie takiego przypisania złożonego jest substytutem zapisu:
l-wartość = l-wartość operator wyrażenie
We wczesnych wersjach języka C stosowany był zapis w postaci:
l-wartość =operator wyrażenie
lecz tę formę zmieniono na współczesną ze względu na niejednoznaczność takiego zapisu, np. x=-5;
.
Nieco inaczej definiowane są symbole złożone przypisania, składające się z operatora porównania i przypisania, dostępne w języku Icon, które interpretowane są następująco:
l-wartość operator_porównania:= wyrażenie # jest interpretowane jak: if l-wartość operator_porównania wyrażenie then l-wartość := wyrażenie
np.
a<:=b # jest równoważne: if a<b then a:=b
Symbole w językach programowania
rodzaj symbolu | operacja | zapis | typ | język programowania |
---|---|---|---|---|
proste | tylko przypisanie | = | operator | AWK, C, C++, JavaScript, Snobol (Spitbol) |
instrukcja | Basic, Cobol, Fortran, PL/I, PL/M, Turbo Prolog, Snobol (Mainbol) | |||
:= | operator | Clipper, Icon, PL/M | ||
instrukcja | Pascal, Modula 2 | |||
przypisanie (zwraca zmienną, a nie jej wartość) | &:= | operator | Icon | |
przypisanie (wznowienie odwraca przypisanie) | <- | operator | Icon | |
wymiana wartości | wymiana wartości | :=: | operator | Icon |
wymiana wartości (wznowienie odwraca przypisanie) | <=> | operator | Icon | |
złożone | dodawanie | += | operator | AWK, C, C++, Clipper, JavaScript, Visual Basic |
+:= | operator | Icon | ||
odejmowanie | -= | operator | AWK, C, C++, Clipper, JavaScript, Visual Basic | |
-:= | operator | Icon | ||
mnożenie | *= | operator | AWK, C, C++, Clipper, JavaScript, Visual Basic | |
*:= | operator | Icon | ||
dzielenie | /= | operator | AWK, C, C++, Clipper, JavaScript, Visual Basic | |
/:= | operator | Icon | ||
dzielenie całkowite | \= | operator | C, C++, Clipper, Visual Basic | |
\:= | operator | Icon | ||
reszta z dzielenia całkowitego | %= | operator | AWK, C, C++, Clipper, JavaScript | |
%:= | operator | Icon | ||
przesunięcie bitowe w prawo | >>= | operator | C, C++, Visual Basic | |
przesunięcie bitowe w lewo | <<= | operator | C, C++, Visual Basic | |
koniunkcja bitowa | &= | operator | C, C++ | |
różnica symetryczna bitowa | ^= | operator | C, C++ | |
alternatywa bitowa | |= | operator | C, C++ | |
potęgowanie | ^= | operator | AWK | |
^:= | operator | Icon | ||
mniejsze | <:= | operator | Icon | |
mniejsze równe | <=:= | operator | Icon | |
równe | =:= | operator | Icon | |
większe równe | >=:= | operator | Icon | |
większe | >:= | operator | Icon | |
nierówne | ~=:= | operator | Icon | |
mniejsze (porównanie leksykalne łańcuchów) | <<:= | operator | Icon | |
mniejsze równe (porównanie leksykalne łańcuchów) | <<=:= | operator | Icon | |
równe (porównanie leksykalne łańcuchów) | ==:= | operator | Icon | |
większe równe (porównanie leksykalne łańcuchów) | >>=:= | operator | Icon | |
większe (porównanie leksykalne łańcuchów) | >>:= | operator | Icon | |
nie równe (porównanie leksykalne łańcuchów) | ~==:= | operator | Icon | |
przecięcie c-zbiorów | **:= | operator | Icon | |
suma c-zbiorów | ++:= | operator | Icon | |
różnica c-zbiorów | --:= | operator | Icon | |
spinanie łańcuchów | ||:= | operator | Icon | |
przeglądanie łańcuchów | ?:= | operator | Icon | |
spinanie list | |||:= | operator | Icon | |
aktywowanie wyrażenia | @:= | operator | Icon | |
równe | ===:= | operator | Icon | |
nie równe | ~==:= | operator | Icon |
Języki programowania
język programowania | rodzaj | proste | złożone | słowo kluczowe |
---|---|---|---|---|
AWK[1] | operator | = | += , -= , *= , /= , %= , /= , ^= | |
Basic | instrukcja | = | LET | |
C, C++ | operator | = | += , -= , *= , /= , %= , >>= , <<= , &= , ^= , |= | |
Clipper | operator | := | += , -= , *= , /= , %= , **= | |
Cobol | instrukcja | = |
| |
Fortran | instrukcja | = | ||
JavaScript | operator | = | += , -= , *= , /= , %= | |
Icon | operator | := | <= , :=: , <=> , +:= , -:= , *:= , /:= , %:= , ^:= , <:= , <=:= , =:= , >=:= , >:= , ~:= , ++:= , --:= , **:= , ||:= , <<:= , >>:= , ~==:= , ?:= , |||:= , ===:= , ~===:= , &:= , @:= | |
Modula 2 | instrukcja | := | ||
Pascal | instrukcja | := | ||
PL/I | instrukcja | = | ||
PL/M | instrukcja | = | ||
operator | := | |||
Turbo Prolog | instrukcja | = | ||
Snobol – wersja Mainbol | instrukcja | = | ||
Snobol – wersja Spitbol | operator | |||
Visual Basic (Visual Studio 2008) | operator | = | += , -= , *= , /= , \= , ^= , >>= , <<= , &= |
Zobacz też
- Instrukcja wywołania
- Operator
Przypisy
- ↑ Opis języka AWK [online], gnu.univ.gda.pl [dostęp 2017-11-26] [zarchiwizowane z adresu 2010-05-26] .
Bibliografia
- Michael Marcotty, Henry Ledgord, W kręgu języków programowania, tłumaczenie: Krysyna Jerzykiewicz, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-1342-7
- John E. Nicholls, Struktura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0246-8
- Jan Bielecki, PL/M język programowania mikroprocesorów, Wydawnictwa Komunikacji i Łączności, Warszawa 1987, Seria: Elektronizacja, zeszyt 25
- Ralph E. Griswold, Madge T. Griswold, Icon, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0871-7
- Jan Ruszczyc, Poznajemy FORTH, SOETO Warszawa 1987 r., Seria: Informatyka mikrokomputerowa
- Jan Bielecki, Język FORTH, Wydawnictwa Naukowo-Techniczne, Warszawa 1988, Seria: Mikrokomputery, ISBN 83-204-0930-6
- Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994 r., ISBN 83-85060-53-7, ISSN 0867-6011
- Niklaus Wirth, Modula 2, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0828-8
- Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, ISBN 83-204-1101-7
- Wojciech Rogowski, Arkadiusz Serodziński, Clipper 5.0, Wydawnictwo PLJ, Warszawa 1991, ISBN 83-85190-20-1
- Jan Bielecki, Rozszerzony PL/I i JCL w systemie OS/RIAD, Państwowe Wydawnictwo Naukowe, Warszawa 1986, Seria: Biblioteka Informatyki, ISBN 83-01-06146-4