Operator (programowanie)


Operator (programowanie) w encyklopedii

Z Wikipedii, wolnej encyklopedii Przejdź do nawigacji Przejdź do wyszukiwania

Operator – konstrukcja językowa jedno-, bądź wieloargumentowa zwracająca wartość.

Do podstawowych operatorów, będących elementem większości języków programowania, należą operatory arytmetyczne: dodawania (+), odejmowania (-), mnożenia (*), dzielenia (/); operatory porównania: większe niż (>), mniejsze niż (<), większe równe (>=), mniejsze równe (<=), równe (= lub ==), różne (<> lub !=), a także operatory operacji logicznych, operacji bitowych, przypisań itd. Główne cechy opisujące operator to liczba i typy argumentów, typ wartości zwracanej, wykonywane działanie, priorytet oraz łączność lub jej brak oraz umiejscowienie operatora względem operandów. Dany język posiada swoją listę operatorów wraz z określonymi cechami, mówiącymi o kolejności wykonywania operacji w przypadku, gdy nie zastosowano nawiasów. W niektórych językach można definiować nowe operatory oraz zmieniać priorytety i łączność.

Spis treści

Umiejscowienie względem operandów | edytuj kod

Operator umieszczany przed swoimi operandami nazywa się operatorem przedrostkowym (prefiksowym), po operandach — przyrostkowym (postfiksowym), pomiędzy operandami — wrostkowym (infiksowym). Dla operatorów składających się z kilku symboli leksykalnych powyższe rozróżnienie nie zachodzi.

Pierwszeństwo, priorytet | edytuj kod

Pierwszeństwo operatorów określa jak należy interpretować wyrażenie gdzie na jednym poziomie (struktury nawiasowej) występują dwa operatory. Przykładowo a + b * c może być interpretowane jako (a + b) * c lub a + (b * c). Gdy + ma wyższy priorytet niż *, zachodzi sytuacja pierwsza. Gdy jest na odwrót — druga. Projektanci języków programowania starają się tak dobierać priorytety, żeby odpowiadały intuicji w typowych konstrukcjach. Na przykład operatory arytmetyczne mają priorytety zgodne z kolejnością wykonywania działań, niższy priorytet mają operatory porównania a jeszcze niższy operatory logiczne. Dlatego wyrażenie 1+2*x < 3 || x==0 nie musi być zapisane jako ((1+(2*x)) < 3) || (x==0).

Łączność, wiązanie | edytuj kod

Łączność to cecha operatorów pozwalająca jednoznacznie interpretować wyrażenie w którym występują operatory o tym samym priorytecie (w szczególności kilka wystąpień tego samego operatora). Wyrażenie a+b-c będzie zinterpretowane jako (a+b)-c jeśli operatory + i - są lewostronnie łączne a a+(b-c) jeśli prawostronnie łączne. Operatory o tym samym priorytecie ale innej łączności nie mogą być mieszane ze sobą. Operatory mogą nie być łączne, wtedy również ich mieszanie z innymi jest niedozwolone. W większości języków podstawowe operatory arytmetyczne są łączne lewostronnie, natomiast operatory potęgowania czy przypisania prawostronnie.

Lista operatorów w najpopularniejszych językach | edytuj kod

(do uzupełnienia o pozostałe języki)

Przykładowy zapis w języku C | edytuj kod

(zmienna liczba jest typu int)

liczba *= ((liczba=10) + 7) % 3; 

Nawiasy w tym przypadku wymusiły zmianę priorytetów operatorów. Działania wykonane zostaną w porządku narzuconym przez nawiasy. To samo wyrażenie pozbawione nawiasów:

liczba *= liczba = 10 + 7 % 3; 

jest również poprawne ze względu na składnię. Wynik będzie jednak inny – pierwsza wykonana zostanie operacja dzielenia modulo, następnie dodawania, a na końcu oba przypisania od prawej do lewej.

W języku C kolejność obliczania operandów operatora nie jest gwarantowana ze względu na zastrzeżenie możliwości optymalizacji kodu wynikowego przez kompilator (nie dotyczy to operatorów &&, ||, ?: oraz ,). Użycie operandów, których obliczenie wartości wpływa na wartość pozostałych nie gwarantuje takiego samego wyniku we wszystkich implementacjach języka.

Np. kod:

int i = 1; tablica[i] = i++; 

nie gwarantuje, czy wartość 1 zostanie wstawiona pod indeks 1, czy może pod indeks 2 tablicy.

Zobacz też | edytuj kod

Przypisy | edytuj kod

  1. Według implementacji Microsoftu: Operator Precedence (JavaScript)
  2. – w niektórych kompilatorach C i C++ dozwolony jest również zapis n[tablica]. Jest to spowodowane faktem, że operator tablica[n] jest tłumaczony na *(tablica+n), a dodawanie jest przemienne.
  3. – plus unarny wprowadzono w ANSI C
  4. Obsługiwany wyłącznie w pętli for

Bibliografia | edytuj kod

  1. Brian W. Kernighan, Dennis M. Ritchie: Język ANSI C. Warszawa: WNT, 2004. ISBN 83-204-2979-X.
  2. Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: Kompilatory Reguły, metody i narzędzia. Warszawa: WNT, 2002, seria: Klasyka informatyki. ISBN 83-204-2656-1.
Na podstawie artykułu: "Operator (programowanie)" pochodzącego z Wikipedii
OryginałEdytujHistoria i autorzy