Przypisanie

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

Rodzaje przypisania

Przypisanie może zostać dokonane:

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 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:

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 o język 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 symboluoperacjazapistypjęzyk programowania
prostetylko przypisanie=operatorAWK, C, C++, JavaScript, Snobol (Spitbol)
instrukcjaBasic, Cobol, Fortran, PL/I, PL/M, Turbo Prolog, Snobol (Mainbol)
:=operatorClipper, Icon, PL/M
instrukcjaPascal, Modula 2
przypisanie (zwraca zmienną, a nie jej wartość)&:=operatorIcon
przypisanie (wznowienie odwraca przypisanie)<-operatorIcon
wymiana wartościwymiana wartości:=:operatorIcon
wymiana wartości (wznowienie odwraca przypisanie)<=>operatorIcon
złożonedodawanie+=operatorAWK, C, C++, Clipper, JavaScript, Visual Basic
+:=operatorIcon
odejmowanie-=operatorAWK, C, C++, Clipper, JavaScript, Visual Basic
-:=operatorIcon
mnożenie*=operatorAWK, C, C++, Clipper, JavaScript, Visual Basic
*:=operatorIcon
dzielenie/=operatorAWK, C, C++, Clipper, JavaScript, Visual Basic
/:=operatorIcon
dzielenie całkowite\=operatorC, C++, Clipper, Visual Basic
\:=operatorIcon
reszta z dzielenia całkowitego%=operatorAWK, C, C++, Clipper, JavaScript
%:=operatorIcon
przesunięcie bitowe w prawo>>=operatorC, C++, Visual Basic
przesunięcie bitowe w lewo<<=operatorC, C++, Visual Basic
koniunkcja bitowa&=operatorC, C++
różnica symetryczna bitowa^=operatorC, C++
alternatywa bitowa|=operatorC, C++
potęgowanie^=operatorAWK
^:=operatorIcon
mniejsze<:=operatorIcon
mniejsze równe<=:=operatorIcon
równe=:=operatorIcon
większe równe>=:=operatorIcon
większe>:=operatorIcon
nierówne~=:=operatorIcon
mniejsze (porównanie leksykalne łańcuchów)<<:=operatorIcon
mniejsze równe (porównanie leksykalne łańcuchów)<<=:=operatorIcon
równe (porównanie leksykalne łańcuchów)==:=operatorIcon
większe równe (porównanie leksykalne łańcuchów)>>=:=operatorIcon
większe (porównanie leksykalne łańcuchów)>>:=operatorIcon
nie równe (porównanie leksykalne łańcuchów)~==:=operatorIcon
przecięcie c-zbiorów**:=operatorIcon
suma c-zbiorów++:=operatorIcon
różnica c-zbiorów--:=operatorIcon
spinanie łańcuchów||:=operatorIcon
przeglądanie łańcuchów?:=operatorIcon
spinanie list|||:=operatorIcon
aktywowanie wyrażenia@:=operatorIcon
równe===:=operatorIcon
nie równe~==:=operatorIcon

Języki programowania

Języki programowania i symbole przypisania
język programowaniarodzajprostezłożonesłowo kluczowe
AWK[1]operator=+=, -=, *=, /=, %=, /=, ^=
Basicinstrukcja=LET
C, C++operator=+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=
Clipperoperator:=+=, -=, *=, /=, %=, **=
Cobolinstrukcja=
  • COMPUTE
  • MOVE ... TO ...
Fortraninstrukcja=
JavaScriptoperator=+=, -=, *=, /=, %=
Iconoperator:=<=, :=:, <=>, +:=, -:=, *:=, /:=, %:=, ^:=, <:=, <=:=, =:=, >=:=, >:=, ~:=, ++:=, --:=, **:=, ||:=, <<:=, >>:=, ~==:=, ?:=, |||:=, ===:=, ~===:=, &:=, @:=
Modula 2instrukcja:=
Pascalinstrukcja:=
PL/Iinstrukcja=
PL/Minstrukcja=
operator:=
Turbo Prologinstrukcja=
Snobol – wersja Mainbolinstrukcja=
Snobol – wersja Spitboloperator
Visual Basic (Visual Studio 2008)operator=+=, -=, *=, /=, \=, ^=, >>=, <<=, &=

Zobacz też

Przypisy

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

Bibliografia