Operatory w Java

Samymi zmiennymi oraz ich typami nie napiszemy programu. Potrzebujemy jeszcze kilku dodatkowych składników.

Jednym z podstawowych składników każdego programu są operatory. Pozwalają one wykonywać różnego rodzaju operacje (arytmetyczne bądź logiczne) na zadanych zmiennych. Ten wpis poświęcony jest właśnie operatorom w Java.

Operatory porównania

Operatory porównania porównują ze sobą dwie liczby (i tylko liczby). Liczby te mogą być zapisane w zmiennej, bądź być zwrócone przez wykonaną operację. W Java istnieje 6 operatorów porównania:

  • == – (równe) sprawdza czy obie liczby są sobie równe (dokładnie takie same) np.
    6 == 6 zwróci true;
    4 == 1 zwróci false,
  • != – (różne) sprawdza czy podane liczby są od siebie różne np.
    6 != 6 zwróci false;
    4 != 1 zwróci true,
  • < – (mniejsze) sprawdza czy liczba po lewej stronie jest mniejsza od tej po prawej np.
    3 < 6 zwróci true;
    4 < 1 zwróci false,
  • > – (większe) sprawcza czy liczba po lewej stronie jest większa od tej po prawej np.
    3 > 6 zwróci false;
    4 > 1 zwróci true,
  • <= – (mniejsze bądź równe) sprawdza czy liczba po lewej stronie jest mniejsza bądź równa tej po prawej np.
    3 <= 6 zwróci true;
    6 <= 6 zwróci true;
    4 <= 1 zwróci false,
  • >= – (większe bądź równe) sprawdza czy liczba po lewej stronie jest większa bądź równa tej po prawej np.
    3 >= 6 zwróci false;
    4 >= 1 zwróci true;
    4 >= 4 zwróci true.

Operatory logiczne

Oprócz samych operatorów porównania mamy do dyspozycji operatory logiczne. Pozwalają one wnioskować na podstawie dwóch podanych wartości logicznych. Pozwala to budować jeszcze bardziej złożone operacje warunkowe.

W Java znajdują się 4 operatory logiczne:

  • && – (logiczne i) zwróci true, wyłącznie jeżeli obie strony operatora są prawdziwe np.
    true && true zwróci true;
    false && true zwróci fase;
    3 == 3 && 4 > 1 zwróci true,
  • || – (logiczne lub) zwróci true, jeżeli jedna ze stron operatora jest prawdziwa np.
    true || true zwróci true;
    true || false zwróci true;
    false || false zwróci false;3 == 1 || 3 > 1 zwróci true,
  • ^ – (logiczna alternatywa wykluczająca) zwróci true wyłącznie gdy obie strony operatora mają różne wartości np.true ^ true zwróci false;false ^ false zwróci false;false ^ true zwróci true;3 == 3 ^ 5 < 1 zwróci true,
  • ! – (logiczne zaprzeczenie), po prostu odwraca wartość logiczną np.
    !true zwróci fasle;
    !false zwróci true;
    !(3 == 3) zwróci false.

Warto również zauważyć, że JVM nie zawsze będzie wykonywał wszystkie obliczenia logiczne. Dalsze warunki nie będą sprawdzane jeżeli nie będą one miały wpływu ogólny wynik wyrażenia. Przypuśćmy że mamy warunek: 5 == 1 && 3 == 3. Wartość logiczna drugiego porównania nie zostanie nigdy obliczona, gdyż wartość false zwrócona przez pierwszą operację porównania wyklucza całkowicie możliwość powodzenia całego wyrażenia logicznego. Podobnie jest z operatorem ||, z tą różnicą że zwrócenie wartości true w pierwszym członie warunku spowoduje pominięcie wykonania drugiego członu.

Operatory arytmetyczne

Skoro już jesteśmy przy temacie operatorów, nie możemy pominąć operatorów arytmetycznych:

  • + – operator dodawania,
  • – operator odejmowania,
  • * – operator mnożenia,
  • \ – operator dzielenia,
  • % – operator modulo (reszta z dzielenia całkowitego np. 5 % 2 zwróci 1, gdyż 2 * 2 + 1 = 5), operacja ta zawsze zwraca liczbę całkowitą i służy głównie do sprawdzenia czy dana liczba jest podzielna przez inną (4 % 2 == 0). Zwrócenie 0 przez tą operację oznacza ze liczba z lewej strony operatora jest całkowicie podzielna przez liczbę po prawej stronie.

Operatory arytmetyki binarnej

W aplikacjach Java spotykane są bardzo rzadko, częściej można je zobaczyć wewnątrz biblioteki standardowej JAVA lub niskopoziomowych bibliotekach. Operatory te służą do wykonywania obliczeń na liczbach binarnych o całkowitej wartości (tylko typy long, int, short, char oraz byte).

Celem tego kursu jest nauczenie Ciebie programowania w Java. Dokładne przedstawienie operacji binarnych wykracza po za jego zakres. Poniżej znajduje się krótkie wprowadzenie w zagadnienia arytmetyki binarnej, więcej informacji na ten temat znajdziesz w tym opracowaniu.

W operacjach arytmetyki binarnej biorą udział kolejne bity danej liczy. Co to znaczy? Załóżmy że chcemy wykonać operację OR na dwóch (pseudo)liczbach WX oraz YZ. Operację taką można zapisać jako:

WX | YZ = (W | Y)(X | Z).

Jeżeli teraz podstawimy W = 1, X = 0, Y = 0, Z = 1, wtedy otrzymamy następujące równanie:

10 | 01 = (1 | 0)(0 | 1) = 11.

W przypadku operacji przesunięć, do liczby dopisywane jest zero na jej początku (przesunięcie w prawo) lub na jej końcu (przesunięcie w lewo). Wartość jaka znajdowała się przed operacją przesunięcia na pozycji ostatniej (w przypadku przesunięcia w prawo) lub bądź pierwszej (przesunięcie w lewo), zostaje usunięta. Dokładny opis przesunięć znajdziesz na blogu Jacka Laskowskiego.

W Java dostępne są następujące operatory arytmetyki binarnej:

  • | – binarna operacja OR np.
    2 | 1 da w wyniku 3 (gdyż: dwa w zapisie binarnym to 10, jeden to 01, operacja 10 OR 01 da w wyniku 11, czyli 3);
    2 | 2 da w wyniku 2 (gdyż: 10 OR 10 daje 10),
  • & – binarna operacja AND np.
    2 & 1 = 0;
    2 & 2 = 2,
  • << – przesunięcie w lewo ze znakiem np.
    4 >> 1 da w wyniku 2 (gdyż: cztery w zapisie binarnym to 100, przesunięcie o jeden bit w prawo (ilość bitów określa liczba po prawej stronie operatora) zmienia czwórkę w dwójkę: 100 >> 1 = 010);
    4 >> 2 da w wyniku 1 (gdyż: 100 >> 2 = 001),
  • >> – przesunięcie w praw ze znakiem np.
    2 << 1 = 4 (010 << 1 = 100); 3 << 2 = 12 (011 << 2 = 1100),
  • >>> – przesunięcie w prawo bez znaku

Warto od razu wspomnieć, o efekcie utraty precyzji. Występuje on wtedy gdy pomnożymy przez siebie dwie liczby typu float, a wynik również zapiszemy w zmiennej typu float. Wynik takiej operacji może nie zmieścić się w zakresie typu float. Dlatego JVM obetnie końcowe liczy wyniku (zmniejszy jego precyzję), tak żeby zmieścił się w zakresie float.

Czasami takie działanie jest pożądane, np. kiedy interesuje nas tylko część całkowita danej operacji. W takim wypadku zapisanie wyniku w zmiennej typu int zagwarantuje nam pozbycie się części ułamkowej.

5 Comments Operatory w Java

  1. szymon

    Zastosowac mozna jeszcze jako operatory logiczne | i & (nie tylko || i && ). Roznica jest taka, ze przy zastosowaniu podwojnych nie bedzie sprawdzana druga czesc rownania jezeli pierwsza juz moze sluzyc za wynik. Na przyklad obj != null && obj.isSmth() nie wywola NPE jezeli obj jest null’em (pierwsza czesc rownania moze posluzyc za wynik – false), natomiast jezeli bedzie obj != null & obj.isSmth() to powstanie NPE, poniewaz beda sprawdzone obie strony rownania.

    Reply
    1. Dariusz Łuksza

      Pojedyncze | oraz & są stosowane częściej jako operatory arytmetyki binarnej niż operatory logiczne. I w takim właśnie kontekście dodam je do tego wpisu.

      Reply
    1. Dariusz Łuksza

      Jedynym miejscem w jakim spotkałem się z operatorami bitowymi jest jgit. Masz rację, warto o nich przynajmniej wspomnieć. Dodam je po weekendzie.

      Reply

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *