Przypisanie (podstawienie) – informatyczna operacja nadania, umieszczenia, wpisania do określonej l-wartości nowej wartości.

Rodzaje przypisania

edytuj

Przypisanie może zostać dokonane:

Instrukcja przypisania

edytuj
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

edytuj

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

edytuj

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

edytuj
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

edytuj
Osobny artykuł: Instrukcja wywołania.
Osobny artykuł: Argument (informatyka).

Przy wywołaniu podprogramu, a więc

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

edytuj

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

edytuj

Takie przypisanie następuje:

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

edytuj

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ń

edytuj

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

edytuj

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.

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.

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

edytuj

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ść

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

edytuj

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

edytuj

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

edytuj
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

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

edytuj

Przypisy

edytuj
  1. Opis języka AWK [online], gnu.univ.gda.pl [dostęp 2017-11-26] [zarchiwizowane z adresu 2010-05-26].

Bibliografia

edytuj