Operatory dostępne w języku Java możemy podzielić na cztery grupy. Są to operatory arytmetyczne, logiczne, relacyjne oraz operatory przypisania.
Operatory arytmetyczne to: operator sumy liczb i konkatenacji stringów +, operator różnicy liczb -, operator iloczynu liczb *, operator ilorazu liczb /, operator reszty z dzielenia (modulo) % oraz operatory inkrementacji i dekrementacji, tj. ++ oraz ‑‑. Operatory +, -, *, / oraz % dla operandów liczbowych to odpowiedniki dobrze znanych operacji matematycznych. Operatory ++ i — to operatory jednoargumentowe. Operator ++ służy do zwiększania o jeden wartości swego operandu a operator — do analogicznego zmniejszania wartości. Składnia wyrażenia arytmetycznego dla operatorów dwuargumentowych jest następująca:
{operand pierwszy} {operator dwuargumentowy} {operand drugi}
a dla operatorów jednoargumentowych:
{operator jednoargumentowy}{operand}
albo:
{operand}{operator jednoargumentowy}
Jak widać operatorów inkrementacji i dekrementacji możemy używać w wersji prefixowej i postfixowej. Mówimy wtedy odpowiednio o preinkrementacji i postinkrementacji oraz predekrementacji i postdekrementacji.
Różnica między operatorami inkrementacji i dekrementacji w wersji prefixowej i postfixowej jest taka, że wartością wyrażenia dla wersji postfixowej jest wartość z przed wykonania operacji a dla wersji prefixowej wartość po wykonaniu operacji. Przykładowo, jeśli początkowo zmienna x miała wartość 5 to wyrażenie ++x ma wartość 6 a wyrażenia x++ ma wartość 5, mimo że w wyniku obydwu tych operacji wartość zmiennej x została zwiększona o 1. Mówiąc jeszcze inaczej, uruchomienie instrukcji:
int x = 5; System.out.println(++x); System.out.println(x);
spowoduje wyświetlenie dwukrotnie liczby 6, natomiast efektem uruchomiania kodu:
int x = 5;
System.out.println(x++);
System.out.println(x);
będzie wyświetlenie liczby 5 a potem liczby 6. Instrukcja System.out.println(++x) powoduje, że w pierwszej kolejności zwiększana jest wartość zmiennej x a dopiero potem wartość ta jest odczytywana i wyświetlana, natomiast instrukcja System.out.println(x++) ma tę semantykę, że wpierw pobierana jest i wyświetlana wartość zmiennej x, a dopiero potem wartość ta jest inkrementowana.
Operator + oprócz tego że jest operatorem sumy liczb jest też operatorem konkatenacji stringów. Operator + jest operatorem konkatenacji, jeśli choć jeden z operandów tego operatora jest stringiem. Operator konkatenacji ma ten sam priorytet co operator sumy, co daje czasem niespodziewane efekty. Przykładowo wykonanie instrukcji:
System.out.println("2 plus 2 to " + 2 + 2);
spowoduje wyświetlenie napisu 2 plus 2 to 22.
Pierwszeństwo jeśli chodzi o kolejność wykonywania działań mają zawsze operatory unarne, a więc ++ i –. Następnie wykonywane są operacje *, / oraz % a operatory + i – wiążą najsłabiej. Poza tym, jeśli kolejność wykonywania działań nie jest w pełni wyznaczona przez pierwszeństwo operatorów to są one wykonywane od lewej do prawej.
W wyrażeniu „2 plus 2 to ” + 2 + 2 z powyższego przykładu jako pierwsza wykona się więc operacja konkatenacji „2 plus 2 to ” + 2 której wynikiem jest string 2 plus 2 to 2. Następnie wykonana będzie konkatenacja „2 plus 2 to 2” + 2 a więc w rezultacie otrzymamy string 2 plus 2 to 22. Kolejność wykonywania działań możemy oczywiście zmienić, stosując nawiasy. W powyższym przykładzie – aby otrzymać spodziewany wynik – wystarczyłoby ująć w nawiasy podwyrażenie 2 + 2.
Co to jest preinkrementacj a, postinkrementac ja, predekrementacj a i postdekrementac ja?
Grzegorz,
Ogólnie inkrementacja to zwiększenie wartości (o 1), a dekrementacja zmniejszenie wartości. Preinkrementacj a to zwiększenie wartości (o 1) przed implementacją, postinkrementac ja to zwiększenie wartości (o 1) po implementacji, predekrementacj a to zmniejszenie wartości (o 1) przed implementacją, a postdekrementac ja to zmniejszenie wartości po implementacji funkcji.