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.
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.
GO TO FULL VERSION