Prawo Murphy'ego: Każdy może ustalać nową regułę.
Część 3.2. Operatory
Arytmetyczne  |   Bitowe  |   Logiczne  |   Przypisania  |   Porównania

Operatory arytmetyczne

Za pomocą operatorów arytmetycznych możemy wykonywać działania na zmiennych wszystkich typów podstawowych z wyjątkiem typu boolean. Jeżeli chociaż jeden z argumentów działania jest typu rzeczywistego (double lub float), to wynik również jest typu rzeczywistego. W przeciwnym wypadku wynik jest zawsze typu całkowitego. Jest to istotne szczególnie w przypadku dzielenia, gdyż dzielenie liczb całkowitych w wyniku zwróci zawsze liczbę całkowitą (obciętą, a nie zaokrągloną).

Poniższa tabela przedstawia wszystkie dostępne w Javie operatory arytmetyczne:

operator nazwa przykład objaśnienie
* mnożenie x * y mnożenie x przez y
/ dzielenie x / y dzielenie x przez y
% modulo x * y reszta z dzielenia x przez y
+ dodawanie x + y dodawanie x do y
- odejmowanie x - y odejmowanie y od x
++ inkrementacja x++
++x
inkrementacja zmiennej x po jej użyciu
inkrementacja zmiennej x przed jej użyciem
-- dekrementacja x--
--x
dekrementacja zmiennej x po jej użyciu
dekrementacja zmiennej x przed jej użyciem

Żeby sprawdzić jak te operatory działają w praktyce i zobaczyć ich wynik napisz poniższy program, a następnie go skompiluj i uruchom:

public class Przyklad
{  public static void main (String args[])
   {  int x = 2;
      int y = 5;
      System.out.println ("x * y = " + (x * y));
      System.out.println ("x / y = " + (x / y));
      System.out.println ("x % y = " + (x % y));
      System.out.println ("x + y = " + (x + y));
      System.out.println ("x - y = " + (x - y));
      System.out.println ("++x = " + (++x));
      System.out.println ("x++ = " + (x++));
      System.out.println ("x = " + (x));
   }
}

Uruchomiony program powinien wyświetlić taki wynik:

Zwróć uwagę na trzy ostatnie wiersze: pokazują one wyraźnie różnicę działania miedzy przedrostkową i przyrostkową inkrementacją zmiennej. Analogicznie działa dekrementacja (--). Możesz to łatwo sprawdzić, zmieniając operator ++ na --.

W powyższym programie zmień typ jednej ze zmiennych x lub y na doble i ponownie go skompiluj i uruchom. Tym razem efekt działania programu powinien wyglądać tak:

Poza różą formą zapisu wyniku jedyna rzeczywista różnica występuje - zgodnie z tym co powiedzieliśmy wcześniej - w wyniku dzielenia.

W przypadku, gdy wynik działania przekracza maksymalna dopuszczalną dla danego typu wartość, to w Javie - w odróżnieniu od innych języków programowania - nie następuje przepełnienie, ale wynik modulo (reszta z dzielenia) otrzymanego wyniku przez maksymalną wartość. Możesz to sprawdzić na poniższym przykładzie:

public class Przyklad
{  public static void main (String args[])
   {  int x = (int)Math.pow(2, 32) + 1;
           // Math.pow(2, 32) służy do obliczenia 2 do potęgi 32              
      int y = x + x;              
      System.out.println ("x = " + x);
      System.out.println ("y = " + y);
  }
}

Wynik tego programu powinien być następujący:

Operatory bitowe

Operatory bitowe - jak sama nazwa wskazuje - działają na bitowej reprezentacji liczb. Możemy ich używać jedynie do zmiennych typu całkowitego: byte, char, int i long.

W poniższej tabeli przedstawione są wszystkie dostępne w Javie operatory bitowe:

operator nazwa przykład    objaśnienie
~ negacja ~x zamienia bity równe 0 na 1, a bity równe 1 na 0
& iloczyn - AND x & y jeżeli odpowiadające sobie bity x i y równe 1, to odpowiedni bit wyniku równy 1, w przeciwnym razie 0
| suma - OR x | y jeżeli odpowiadające sobie bity x i y równe 0, to odpowiedni bit wyniku równy 0, w przeciwnym razie 1
^ różnica symetryczna - XOR x ^ y jeżeli odpowiadające sobie bity x i y mają różne wartości, to odpowiedni bit wyniku równy 1, w przeciwnym razie 0
<< przesunięcie w lewo 1 << 3 wynikiem będzie liczba 8
>> przesunięcie w prawo 8 >> 3 wynikiem będzie liczba 1
>> przesunięcie w prawo z wypełnieniem zerami 8 >>> 3 wynikiem będzie liczba 1

Podobnie jak przy operatorach arytmetycznych sprawdźmy jak działają w praktyce na przykładzie poniższyego programu:

public class Przyklad
{  public static void main (String args[])
   {  int x = 25;              // bitowo: 011001
      int y = 15;              // bitowo: 001111
      System.out.println ("~x = " + (~x));
      System.out.println ("x & y = " + (x & y));
      System.out.println ("x | y = " + (x | y));
      System.out.println ("x ^ y = " + (x ^ y));
      System.out.println ("4 << 2 = " + (4 << 2));
      System.out.println ("32 >> 2 = " + (32 >> 2));
      System.out.println ("32 >>> 2 = " + (32 >>> 2));
   }
}

Uruchomiony program powinien wyświetlić taki wynik:

Sprawdźmy te wyniki wykonując samodzielnie operacje bitowe na liczbach użytych w powyższym programie:

1 argument operator 2 argument wynik binarny wynik dziesiętny
~011001100110-26 (kod dopełnieniowy)
011001&0011110010019
011001|00111101111131
011001^00111101011022
000100<<00001001000016
100000>>0000100010008
100000>>>0000100010008

Operatory logiczne

Operatory logiczne służą do budowania złożonych warunków logicznych. Argumentami muszą być albo zmienne typu boolean, albo wyrażenia, które posiadają wartość logiczną prawda luv fałsz, np. x < 20 lub y >= x. W Javie można używać trzech operatorów logicznych:
operator nazwa przykład objaśnienie
! zaprzeczenie - NOT !x true gdy x jest równy false, w przeciwnym razie false
&& koniunkcja - AND x && y true gdy x jest false i y jest false, w przeciwnym razie false
|| alternatywa - OR x || y true gdy x lub y jest różny od false, w przeciwnym razie false

Podobnie, jak w poprzednich przypadkach, sprawdźmy również teraz jak te operatory działają w praktyce. W tym celu stworzymy kolejny program testujący operatory logiczne:

public class Przyklad
{  public static void main (String args[])
   {  System.out.println ("    2 > 5 = " + (2 > 5));
      System.out.println ("NIE 2 > 5 = " + ( !(2 > 5)));
      System.out.println (" 2 > 5  LUB  5 > 2 = " + (2 > 5 || 5 > 2));
      System.out.println (" 2 > 5   I   5 > 2 = " + (2 > 5 && 5 > 2));
   }
}

Uruchomiony program powinien wyświetlić taki wynik:

Operatory przypisania

Za pomocą operatorów przypisania możemy - jak wskazuje nazwa - przypisać do zmiennej jakąś wartość lub wynik obliczonego wyrażenia. W Javie można używać przypisań: prostych, złożonych i warunkowych.
operator nazwa przykład objaśnienie
= przypisanie x = y przypisanie zmiennej x wartości zmiennej y
op= przypisanie złożone x op= y równoważne wyrażeniu: x = x op y, gdzie op jest dowolnym operatorem arytmetycznym lub bitowym
? : przypisanie warunkowe (x>5) ? y : z jeżeli x jest większe od 5, to wybrana będzie wartość y, przeciwnym razie z

O ile proste przypisanie nie wymaga chyba żadnych komentarzy, to przypisanie złożone prześledzimy tradycyjnie na przykładowym programie:

public class Przyklad
{  public static void main (String args[])
   {  int x = 1;
      System.out.println ("x = " + x);
      x += 5;      System.out.println ("x = " + x);
      x -= 5;      System.out.println ("x = " + x);
      x *= 5;      System.out.println ("x = " + x);
      x >>= 2;     System.out.println ("x = " + x);
      x <<= 5;     System.out.println ("x = " + x);
      x |= 5;      System.out.println ("x = " + x);
      x &= 15;     System.out.println ("x = " + x);
  }
}

Po skompilowaniu i uruchomieniu tego programu powinieneś otrzymać takie wyniki:

I jeszcze jeden przykład ilustrujący użycie operatora przypisania warunkowego:

public class Przyklad
{  public static void main (String args[])
   {  int x = 1;
      System.out.println ("znak liczby: " + ((x>0) ? "plus" : "minus"));
  }
}

Ponieważ x jest większe od zera, to powyższy program powinien wyświetlić napis:

znak liczby: plus

Operatory porównania

Operatory porównania służą do sprawdzenia relacji między zmiennymi lub wyrażeniami. Zawsze zwracają wartość logiczną true lub false informującą czy porównanie jest prawdą, czy fałszem.

operator nazwa przykład objaśnienie
> większe niż x > y true gdy x jest większy od y, w przeciwnym razie false
>= większe lub równy x >= y true gdy x jest większy lub równy y, w przeciwnym razie false
< mniejszy niż x < y true gdy x jest mniejszy od y, w przeciwnym razie false
<= mniejszy lub równy x <= y true gdy x jest mniejszy lub równy y, w przeciwnym razie false
== równy x == y true gdy x jest równy y, w przeciwnym razie false
!= nie równy x != y true gdy x jest różny od y, w przeciwnym razie false
« wstecz   dalej »