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 true
nieważ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 expression3
zawiera wywołania metod, metody te nie zostaną wywołane !
To samo dotyczy &&
operatora logicznego:
(expression1) && (expression2) && (expression3)
Jeśli expression1
jest równe false
, nie ma sensu oceniać expression2
i expression3
: wynik będzie false
nieważ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! = null
to true
.
Jeśli s
jest 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.
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 b
będzie 5
, a nie 6
tak, 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, 1
a 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 b
bę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.
GO TO FULL VERSION