Przeczytaj
Kategorie operatorów
Projektanci języków programowania mogą tworzyć operatory na różne sposoby. Zwykle grupuje się je według następujących kryteriów:
operatory jednoargumentowe (unarne), dwuargumentowe (binarne) oraz wieloargumentowe,
operatory arytmetyczne (służące do działań matematycznych), relacyjne (służące do porównywania wartości), logiczne (służące do operacji logicznych, takich jak np. koniunkcja) oraz operatory przypisania (czyli po prostu przypisanie wartości do zmiennej).
Przykładowe operatory
Zacznijmy od najprostszych operatorów, z którymi mamy styczność na co dzień. Mowa o operatorach arytmetycznych:
operator , czyli suma, np. da wartość ,
operator , czyli różnica, np. da wartość ,
operator , czyli iloczyn, np. da wartość ,
operator , czyli iloraz, np. da wartość ,
operator , czyli reszta z dzielenia, np. da wynik .
Teraz rozpatrzmy kilka przykładów operatorów relacyjnych:
operator , w niektórych językach po prostu , czyli operator równości,
operator , w niektórych językach , czyli operator nierówności,
operatory , czyli odpowiednio operatory większy lub równy oraz mniejszy lub równy,
operatory , czyli operatory większy i mniejszy.
Zajmijmy się teraz kategorią operatorów logicznych:
operatory , w niektórych językach and, or, czyli operatory odpowiednio logicznej koniunkcji („ oraz ”) oraz alternatywy („ lub ”),
operator , w niektórych językach not, czyli operator negacji logicznej; dla PRAWDA wartość to FAŁSZ i na odwrót.
Ostatnim i prawdopodobnie najważniejszym operatorem jest , w niektórych językach . To operator przypisania jednej wartości do drugiej, np. dla przypisuje on liczbę do zmiennej .
Priorytety operatorów
Rozpatrzmy przykład kodu w pewnym języku:
Intuicyjnie możemy stwierdzić, że wynikiem tego działania będzie suma liczby oraz iloczynu liczb oraz . Jednak nie w każdej sytuacji będzie to takie proste, zwłaszcza gdy używamy różnych typów operatorów jednocześnie, na przykład logicznych i arytmetycznych. Rozważmy fragment kodu:
Czy otrzymujemy ułamek czy może liczbę ?
Z pomocą przychodzi tu pojęcie priorytetów operatorówpriorytetów operatorów. Twórcy języków, jeżeli to możliwe, zazwyczaj projektują operatory tak, aby kolejność ich działania odpowiadała porządkowi w matematyce. Ponieważ z kolejności wykonywania działań wynika, że dzielenie zostanie wykonane wcześniej, w większości języków wynikiem a + b / c + d
będzie liczba .
Co jednak w sytuacji, gdy chcemy otrzymać ułamek ? W tym celu używamy nawiasów, które ustalają kolejność operacji w taki sam sposób, w jaki robią to w matematyce. Aby otrzymać ten ułamek, zapiszemy zatem:
Przeciążanie operatorów
Czasami użyteczna może być zmiana działania jakiegoś operatora w konkretnym przypadku. Jeżeli mamy fragment tekstu oraz fragment tekstu , to intuicyjnie możemy stwierdzić, że zapis:
da wartość . Jest to operacja konkatenacji, czyli łączenia wyrażeń, która działa właśnie w taki sposób dla większości języków.
Konkatenacja jest przykładem przeciążania operatorówprzeciążania operatorów, czyli nadania im nowych funkcji. Nie wszystkie języki oferują taką możliwość.
Twórcy języka Java uznali, że konkatenacja wprowadza zbyt duże zamieszanie w kodzie. Przeciążanie operatorów oferują między innymi C++, Python czy C#.
Przeciążania operatorów należy używać świadomie, ponieważ łatwo możemy stworzyć sytuację, w której kod będzie działał w niezrozumiały sposób. Warto zastanowić się, czy jesteśmy w stanie zrozumieć, jak działa przeciążony operator na danych typach zmiennych (na przykład przez analogię do matematyki czy fizyki).
Złym pomysłem byłoby przeciążenie operatora do liczenia wystąpień jakiegoś znaku w zmiennej tekstowej. Jeżeli jednak tworzymy program do symulacji fizycznych, możemy rozważyć przeciążenie operatora do dodania do siebie dwóch wektorów.
Słownik
zasady, według których określona jest kolejność wykonywania operacji w jednym wyrażeniu
przypisanie nowego działania operatora w zależności od konkretnych typów zmiennych, na jakich on operuje