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
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
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
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 + Symbole przypisania 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ęzyki programowania i symbole przypisania język programowania rodzaj proste złożone słowo kluczowe AWK operator = +=, -=, *=, /=, %=, /=, ^= Basic instrukcja = LET C, C++ operator = +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= Clipper operator := +=, -=, *=, /=, %=, **= Cobol instrukcja = COMPUTE