1. Operacje logiczne

Operatory |and &można stosować nie tylko do liczb, ale także do wyrażeń boolowskich.

Ale, jak już wiesz, są &&i ||operatorzy. Dlaczego mielibyśmy używać |zamiast ||i &zamiast &&? Czy jest w tym jakiś sens? Wydaje się, że istnieje. Czasami.

Operatory logiczne ||i &&są wykonywane od lewej do prawej zgodnie z tak zwaną zasadą leniwego działania .

(expression1) || (expression2) || (expression3)

Jeśli expression1 jest równe true, nie ma sensu oceniać expression2 i expression3: wynik będzie truenieważny.

W związku z tym podczas oceniania wyrażeń (są one oceniane od lewej do prawej), gdy tylko otrzymamy true, ocena pozostałych wyrażeń jest pomijana . A jeśli expression2 i expression3zawiera wywołania metod, metody te nie zostaną wywołane !

To samo dotyczy &&operatora logicznego:

(expression1) && (expression2) && (expression3)

Jeśli expression1jest równe false, nie ma sensu oceniać expression2i expression3: wynik będzie falsenieważny.

Jest to ważny fakt, który pozwala pisać takie rzeczy jak:

String s = null;
if (s != null && s.length() > 0) {

Powyższy przykład nigdy nie da ci wyjątku NullPointerException , ponieważ s.length()zostanie wykonany tylko wtedy, gdy pierwsza część s! = nullto true.

Jeśli sjest równe null, część po lewej stronie operatora &&to false, to wynikiem całego wyrażenia boolowskiego jest false, więc część po prawej stronie ( s.length() > 0) nie jest oceniana.

Wszystko to, by powiedzieć:

Jeśli używasz |operatora lub &operatora, nie ma leniwej oceny : każde podwyrażenie będzie zawsze oceniane.



2. Priorytet operacji w Javie

Jak zapewne pamiętasz z lekcji matematyki w szkole średniej, operator mnożenia ma wyższy priorytet niż operator dodawania. Nawiasy mają jeszcze wyższy priorytet: najpierw obliczane są wyrażenia w nawiasach, następnie mnożenie i dzielenie, a następnie dodawanie i odejmowanie.

Operatory w Javie również mają pierwszeństwo. Różnica polega na tym, że a) jest ich nieco więcej, b) dla niektórych operatorów operandy są obliczane od lewej do prawej, a dla innych od prawej do lewej.

Oto tabela ze wszystkimi operatorami Java:

Kategoria Operator Asocjacyjny
Przyrostek () [] . Od lewej do prawej
jednoargumentowy ++ -- ! ~ Od prawej do lewej
Mnożny * / % Od lewej do prawej
Przyłączeniowy + - Od lewej do prawej
Przeniesienie >> >>> << Od lewej do prawej
Relacyjny > >= < <= Od lewej do prawej
Równość == != Od lewej do prawej
BitowoAND & Od lewej do prawej
Exclusive OR(XOR) ^ Od lewej do prawej
BitowoOR | Od lewej do prawej
LogicznyAND && Od lewej do prawej
LogicznyOR || Od lewej do prawej
Warunkowy ?: Od prawej do lewej
Zadanie = += -= *= /= %= >>= <<= &= ^= |= Od prawej do lewej
Przecinek , Od lewej do prawej

Górna linia zawiera operatory o najwyższym priorytecie. Nawiasy ()są używane do jawnego ustawienia priorytetu. Nawiasy kwadratowe []służą do uzyskiwania dostępu do elementu w określonym indeksie zmiennej tablicowej. Operator kropki ( .) służy do uzyskiwania dostępu do pól i metod przy użyciu odwołania do obiektu lub klasy.

Im niżej operatory znajdują się w tabeli, tym niższy jest ich priorytet.

Jeśli używasz wielu operatorów w wyrażeniu, nie bądź leniwy: dodaj nawiasy.

W Javie możesz napisać coś takiego jak if (a & 1<< b > ~c), ale nie powinieneś. Piszesz kod nie tylko dla kompilatora, ale także dla innych programistów. Im bardziej czytelny kod, tym lepiej.



3. Przyrost przedrostka i przyrostka

Jak już wiesz, Java ma operator inkrementacji ( ++) i operator dekrementacji ( --). Odpowiednio zwiększają i zmniejszają wartość zmiennej o 1.

Prawdopodobnie nie wiesz, że istnieją dwa rodzaje tych operatorów: prefiks (operator jest umieszczany przed zmienną) i postfiks (operator jest umieszczany po zmiennej). Dwa rodzaje operatorów działają nieco inaczej.

W Javie możesz napisać takie wyrażenie:

int a = 5;
int b = a++;

Jeśli ++operator występuje po zmiennej, a zmienna jest częścią jakiegoś wyrażenia (jak w powyższym przykładzie), to wyrażenie użyje bieżącej wartości zmiennej, a dopiero potem zmienna zostanie zwiększona o 1.

Innymi słowy, stanie się coś takiego:

int a = 5;
int b = a;
a = a + 1;

To znaczy bbędzie 5, a nie 6tak, jak mogłoby się wydawać na pierwszy rzut oka.

Jeśli ++operator znajduje się przed zmienną, a zmienna jest częścią jakiegoś wyrażenia, najpierw zostanie zwiększona o, 1a dopiero potem jej wartość zostanie użyta w wyrażeniu.

int a = 5;
int b = ++a;

Powyższy przykład jest odpowiednikiem następującego przykładu:

int a = 5;
a = a + 1;
int b = a;

Tutaj bbędzie równe 6.

Istnieje nawet przykład używany przez programistów Java w celu ustalenia, czy ktoś inny jest również programistą Java:

int a = 5;
int b = ++a + ++a;

Tak, to też możesz napisać.

Ten przykład skompiluje się dobrze i zmieni się w coś takiego:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

Dla --operatora wszystko jest dokładnie takie samo.