Przypisanie

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

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

Rodzaje przypisania[edytuj | edytuj kod]

Przypisanie może zostać dokonane:

Instrukcja przypisania[edytuj | edytuj kod]

Information icon.svg 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 implantacjach słowo takie zwykle jest opcjonalne, np. Basic:

 10 LET A=1

Operator przypisania[edytuj | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

Information icon.svg 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 | edytuj kod]

Information icon.svg Osobny artykuł: Instrukcja wywołania.
Information icon.svg 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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

Przypisy

Bibliografia[edytuj | edytuj kod]

  1. 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
  2. John E. Nicholls, Strukrura języków programowania, Wydawnictwa Naukowo-Techniczne, Warszawa 1980, Seria: Informatyka, ISBN 83-204-0246-8
  3. Jan Bielecki, PL/M język programowania mikroprocesorów, Wydawnictwa Komunikacji i Łączności, Warszawa 1987, Seria: Elektronizacja, zeszyt 25
  4. Ralph E. Griswold, Madge T. Griswold, Icon, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0871-7
  5. Jan Ruszczyc, Poznajemy FORTH, SOETO Warszawa 1987 r., Seria: Informatyka mikrokomputerowa
  6. Jan Bielecki, Język FORTH, Wydawnictwa Naukowo-Techniczne, Warszawa 1988, Seria: Mikrokomputery, ISBN 83-204-0930-6
  7. Andrzej Marciniak, Borland Pascal 7.0, Wyd. Nakom, Poznań 1994 r., ISBN 83-85060-53-7, ISSN 0867-6011
  8. Niklaus Wirth, Modula 2, Wydawnictwa Naukowo-Techniczne, Warszawa 1987, Seria: Biblioteka Inżynierii Oprogramowania, ISBN 83-204-0828-8
  9. Jan Bielecki, Turbo C z grafiką na IBM PC, Wydawnictwa Naukowo-Techniczne, Warszawa 1990, Seria: Mikrokomputery, ISBN 83-204-1101-7
  10. Wojciech Rogowski, Arkadiusz Serodziński, Clipper 5.0, Wydawnictwo PLJ, Warszawa 1991, ISBN 83-85190-20-1
  11. 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