Rozdział 2. Operators and assignments

Java Operators

Kolejność operatorów (od największego, do najniższego priorytetu):
  1. Unarne: ++, --, +, -, !, ~, (type)
  2. Arytmetyczne (1): *, /, %
  3. Arytmetyczne (2): +, -
  4. Shift: <<, >>, >>>
  5. Porównania (1): <, <=, >, >=, instanceof
  6. Porównania (2): ==, !=
  7. Bitowe: &, ^, |
  8. Logiczne: &&, ||
  9. Warunkowe: ?:
  10. Przypisania: = op=
Każdy punkt zawiera zbiór operatorów o tym samym priorytecie. Ewaluacja wyrażenia następuje od lewej do prawej, lecz kolejność wykonywania działań zależy od ich priorytetu. Przykład:

int [] a = { 4, 4 };
int b = 1; a[b] = b = 0;

Jako wynik ewaluacji pierwszego członu ostatniego wyrażenia, a[b] wskazywać będzie na ostatni element w tabeli a. Kolejność poszczególnych przypisań wykonywana będzie od prawej do lewej. Zmiennej b przypisana zostanie wartość 0, a następnie ostatniemu elementowi tablicy a aktualna wartość zmiennej b (0).

Maszyna wirtualna Javy przechowuje bitową reprezentację zmiennych w takiej samej postaci na architekturach Little i Big Endian. Operator ~ polega na zamianie wszystkich bitów o wartości 0 na 1, a 1 na 0.

Operatory arytmetyczne

Operatory * i / można stosować dla typów numerycznych oraz char. Zawsze lepiej najpierw mnożyć, a potem dzielić (overflow i underflow - strona 44). Zastosowanie najpierw dzielenia, a następnie mnożenia daje inny wynik, zazwyczaj kompletnie błędny. Dzielenie przez 0 daje ArithmeticException.

Operator modulo

Jeśli drugim argumentem operatora % jest 0, operacja rzuca ArithmeticException. Postępowanie w przypadku operacji modulo jest następujące:
  1. Redukuj wartość pierwszego argumentu o drugi, tak żeby dążyła do 0. W przypadku dodatniej wartości pierwszego argumentu - odejmuj, w przypadku ujemnej - dodawaj.
  2. Jeśli warotść bezwzględna otrzymanej liczby jest mniejsza od wartości drugiego argumentu - jest to wynik. O znaku wyniku decyduje punkt 3.
  3. Wynik jest ujemny jeśli pierwszy argument jest ujemny. Znak drugiego argumentu nie ma znaczenia.
Operator +

Błędny wynik operacji arytmetycznych (overflow i underflow) nie skutkuje żadnym wyjątkiem.
Operator + zastosowany do typów numerycznych daje wynik, który:
1. Jest typem numerycznym.
2. Jest przynajmniej typu int, co wynika z promocji.
3. Jest typu przynajmniej tak dużego jak większy z operandów.
4. Wynik obliczany jest po ówczesnej promocji operandów.

Operator + dla typów nie numerycznych:
1. Przynajmniej jeden z operandów musi być String'iem lub literałem. W przeciwnym wypadku działanie jest nielegalne.
2. Nie String'i konwertowane są do String'u za pomocą metody toString().

Błędy arytmetyczne

Typ numeryczny podzielony lub modulo 0 skutkuje błędem ArithmeticException. Wszystkie porónania z Float lub Double NaN dają fałsz. Należy skorzystać z metody isNaN().

Promocja operandów arytmetycznych

Przed wykonaniem działania operandy uzyskają promocje przynajmniej do typu int.

Operatory logiczne

Podczas porównania mniejszy typ uzyskuje promocje do większego, np. char do float.

Operator Instanceof

Lewy operand może być referencją do obiektu, prawy zaś klasą, interfejsem lub typem tablicowym. Przy typie tablicowym sprawdzane jest czy dana referencja jest tablicą, jak i czy obiekty są prawidłwoego typu, np.:
x instanceof Employee[]
Jeśli lewy operand instanceof jest null, zawsze zwracany jest fałsz.

Inne fakty

1. Na int można robić operacje na bajtach, np. ~
2. Nie można porównywać obiektów różnych typów, np. int ze String.
3. W przypadku operatora ?: także występuje promocja operandów. xxx ? 99.0 : 9 to tak naprawdę xxx ? 99.0 : 9.0

Brak komentarzy:

Prześlij komentarz