1. Logikai műveletek

A |és &operátorok nem csak számokra, hanem logikai kifejezésekre is alkalmazhatók.

De, mint már tudja, vannak &&és ||üzemeltetők. Miért használnánk |helyett ||és &helyett &&? Van ennek valami értelme? Úgy tűnik, hogy van. Néha.

A ||és &&logikai operátorok balról jobbra hajtódnak végre az úgynevezett lusta elv szerint .

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

Ha expression1 egyenlő -val true, akkor nincs értelme expression2 és értékelni expression3: az eredmény ettől függetlenül lesz true.

Ennek megfelelően a kifejezések kiértékelésekor (balról jobbra kerülnek kiértékelésre), amint megkapjuk a -t true, a többi kifejezés kiértékelése kimarad . Ha expression2 pedig expression3metódushívásokat is tartalmaz, akkor ezek a metódusok nem lesznek meghívva !

Ugyanez vonatkozik a &&logikai operátorra is:

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

Ha expression1egyenlő -val false, akkor nincs értelme expression2és értékelni expression3: az eredmény ettől függetlenül lesz false.

Ez egy fontos tény, amely lehetővé teszi, hogy olyan dolgokat írjon, mint:

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

A fenti példa soha nem ad NullPointerException- t , mert s.length()csak akkor kerül végrehajtásra, ha az első s! = nullrész true.

Ha segyenlő -val , akkor az operátortól nullbalra eső rész , akkor az egész logikai kifejezés eredménye , így a jobb oldali ( ) rész nem kerül kiértékelésre.&&falsefalses.length() > 0

Mindaz, amit mondani kell:

|Ha az operátort vagy az operátort használja &, akkor nincs lusta kiértékelés : minden részkifejezés mindig ki lesz értékelve.



2. Művelet elsőbbsége Java nyelven

Valószínűleg emlékszik rá a középiskolai matematika órájáról, hogy a szorzó operátornak nagyobb a prioritása, mint az összeadás operátornak. A zárójeleknek még nagyobb a prioritása: először a zárójelben lévő kifejezések kerülnek kiértékelésre, majd a szorzás és az osztás, majd az összeadás és kivonás.

A Java operátorainak is van prioritási sorrendje. A különbség az, hogy a) valamivel több van belőlük, b) egyes operátorok esetében az operandusok balról jobbra, míg mások esetében jobbról balra kerülnek kiértékelésre.

Itt van egy táblázat az összes Java operátorral:

Kategória Operátor Asszociációs
Postfix () [] . Balról jobbra
Unary ++ -- ! ~ Jobbról balra
Multiplikatív * / % Balról jobbra
Adalékanyag + - Balról jobbra
Változás >> >>> << Balról jobbra
Relációs > >= < <= Balról jobbra
Egyenlőség == != Balról jobbra
BitenkéntAND & Balról jobbra
Exclusive OR(XOR) ^ Balról jobbra
BitenkéntOR | Balról jobbra
LogikusAND && Balról jobbra
LogikusOR || Balról jobbra
Feltételes ?: Jobbról balra
Feladat = += -= *= /= %= >>= <<= &= ^= |= Jobbról balra
Vessző , Balról jobbra

A felső sor a legmagasabb prioritású operátorokat tartalmazza. A zárójelek ()kifejezetten a prioritás beállítására szolgálnak. A szögletes zárójelek []egy tömbváltozó adott indexén lévő elem eléréséhez használhatók. A pont operátor ( .) a mezők és metódusok eléréséhez használható objektumra vagy osztályra való hivatkozással.

Minél alacsonyabban vannak az operátorok a táblázatban, annál kisebb a prioritásuk.

Ha több operátort használ egy kifejezésben, ne legyen lusta: adjon hozzá zárójeleket.

Java nyelven írhat ilyesmit if (a & 1<< b > ~c), de nem szabad. Nem csak a fordítónak írsz kódot, hanem más programozóknak is. Minél olvashatóbb a kód, annál jobb.



3. Előtag és utótag növekménye

Mint már tudja, a Java-nak van egy növelő operátora ( ++) és egy csökkentő operátora ( --). Illetve növelik és csökkentik egy változó értékét -vel 1.

Valószínűleg nem tudod, hogy ezeknek az operátoroknak két típusa van: prefix (az operátor a változó elé kerül) és postfix (az operátor a változó után kerül elhelyezésre). És kétféle operátor egy kicsit másképp működik.

Java nyelven írhat egy ilyen kifejezést:

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

Ha az ++operátor egy változó után jelenik meg, és a változó valamilyen kifejezés része (mint a fenti példában), akkor a kifejezés a változó aktuális értékét fogja használni, és csak ezután fog a változó értéke növekedni 1.

Más szavakkal, valami ehhez hasonló fog történni:

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

Vagyis blesz 5, nem 6úgy, ahogy első pillantásra gondolnád.

Ha az ++operátor a változó előtt van, és a változó része valamilyen kifejezésnek, akkor először növeli, 1és csak ezután kerül felhasználásra a kifejezésben.

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

A fenti példa egyenértékű a következő példával:

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

Itt begyenlő lesz 6.

Van még egy példa, amelyet a Java programozók használnak annak meghatározására, hogy valaki más is Java programozó-e:

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

Igen, ezt is írhatod.

Ez a példa jól összeáll, és valami ilyesmivé alakul:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

A --kezelő számára minden pontosan ugyanaz.