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 expression3
metó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 expression1
egyenlő -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! = null
rész true
.
Ha s
egyenlő -val , akkor az operátortól null
balra 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.&&
false
false
s.length() > 0
|
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 b
lesz 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 b
egyenlő 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.
GO TO FULL VERSION