|
1. java bevezető
|
bet | 6/51 | Sana | 07.04.2017 | Hajmi | 1,08 Mb. | | #3295 |
3.4. Kifejezések
Az operátorok és operandusok halmazát kifejezésnek nevezzük, egy kifejezés mindig egy értéket ad vissza, amelyet általában értékadással átadunk egy változónak, vagy paraméterként adjuk át egy metódusnak. A cikksorozat első részében is használtunk már kifejezéseket, csak nem nevezetük így a leírt sorokat, amelyek egyszerű kifejezések voltak.
Az összetett kifejezések több operátorból és operandusból állnak, és a megszokott matematikai kiértékelési sorrend szerint kell írnunk a kívánalmainkat:
view plaincopy to clipboardprint?
-
int szám = 1 + 2 + 3;
-
System.out.println(szám);
A kifejezés értéke 6 lesz, ahogy azt várjuk, a kifejezése kiértékelése során a számítógép pont úgy viselkedik, ahogy azt annak idején tanultuk: veszi az első két számot, összeadja őket, majd az eredményt és a harmadik számot újfent összeadja. Ebben az esetben nem számít a kiértékelés sorrendje, hiszen teljesen mindegy, hogy a számokat milyen sorrendben adjuk össze, ettől függetlenül a számítógép mindig balról-jobbra haladva végzi el az egyes műveleteket.
A kiértékelés sorrendje változhat a műveleti jelek függvényében, hiszen a szorzás előnyt élvez az összeadással szemben:
view plaincopy to clipboardprint?
-
int szám = 1 + 2 * 3;
-
System.out.println(szám);
A számítógép először a szorzás műveletét végzi el, majd a kapott eredményhez hozzáad egyet, így a végső eredmény 7 lesz. Zárójelezéssel ez a kiértékelési sorrend felülbírálható:
view plaincopy to clipboardprint?
-
int szám = (1 + 2) * 3;
-
System.out.println(szám);
Ebben az esetben a számítógép először a zárójelben lévő műveletet végzi el, majd a kapott eredményt megszorozza hárommal, így kapjuk meg az eredményt, ami 9.
3.4.1. Precedencia - kiértékelési sorrend
A kiértékelési sorrend függ az operátoroktól, így fontos tudni a pontos kiértékelési sorrendet, amelyet vagy megtanulunk, vagy zárójelezünk bizonytalan helyzetben. Lássuk a sorrendet:
-
unáris operátorok (a kiértékelés jobbról balra történik!):
-
--szám: a szám értékének előzetes csökkentése
-
++szám: a szám értékének előzetes növelése
-
szám--: a szám értékének utólagos csökkentése
-
szám++: a szám értékének utólagos növelése
-
- szám: a szám előjelének megváltoztatása
-
~ szám: a szám bináris tagadása (negáció)
-
! igazHamis: egy boolean érték tagadása
-
(type): típuskényszerítés
-
new: új példány létrehozása
-
multiplikatív operátorok:
-
szám * másikSzám: a két szám összeszorzása
-
szám / másikSzám: a szám elosztása egy másikSzámmal
-
szám % másikSzám: maradék képzése (szám osztva másikSzámmal)
-
additív operátorok:
-
szám + másikSzám: a két szám összeadása
-
szám - másikSzám: számból kivonjuk a másikSzámot
-
bitléptetés operátorok:
-
szám << másikSzám: a szám változóban lévő bitek léptetése balra másikSzám pozícióval
-
szám >> másikSzám: a szám változóban lévő bitek léptetése jobbra másikSzám pozícióval - az előjel figyelembevételével
-
szám >>> másikSzám: a szám változóban lévő bitek léptetése jobbra másikSzám pozícióval
-
relációs operátorok:
-
szám < másikSzám: a szám kisebb-e, mint a másikSzám
-
szám <= másikSzám: a szám kisebb vagy egyenlő-e, mint a másikSzám
-
szám > másikSzám: a szám nagyobb-e, mint a másikSzám
-
szám >= másikSzám: a szám nagyobb vagy egyenlő-e, mint a másikSzám
-
instanceof: referencia teszt operátor
-
egyenlőség operátorok:
-
szám == másikSzám: a két szám egyenlő-e egymással
-
szám != másikSzám: a két szám nem egyenlő-e egymással
-
bitenkénti ÉS operátor:
-
szám & másikSzám: a szám és a másikSzám között bitenkénti ÉS művelet
-
igazHamis & másikIgazHamis: az igazHamis és a másikIgazHamis közötti ÉS művelet
-
bitenkénti KIZÁRÓ VAGY operátor:
-
szám ^ másikSzám: a szám és a másikSzám között bitenkénti KIZÁRÓ VAGY művelet
-
igazHamis ^ másikIgazHamis: az igazHamis és a másikIgazHamis közötti KIZÁRÓ VAGY művelet
-
bitenkénti VAGY operátor:
-
szám | másikSzám: a szám és a másikSzám között bitenkénti VAGY művelet
-
igazHamis | másikIgazHamis: az igazHamis és a másikIgazHamis közötti VAGY művelet
-
boolean ÉS operátor:
-
igazHamis && másikIgazHamis: az igazHamis és a másikIgazHamis közötti ÉS művelet
-
boolean VAGY operátor:
-
igazHamis || másikIgazHamis: az igazHamis és a másikIgazHamis közötti VAGY művelet
-
feltételes értékadás operátor:
-
szám == másikSzám ? szám : másikSzám: feltételes értékadás (lásd fent bővebben)
-
értékadás operátor:
-
szám = másikSzám: a szám változó értéke felveszi a másikSzám értékét
-
értékadás művelettel operátorok:
-
szám += másikSzám: a szám változó értéke a szám előző értéke és a másikSzám összege lesz
-
szám -= másikSzám: a szám változó értéke a szám előző értéke és a másikSzám különbsége lesz
-
szám *= másikSzám: a szám változó értéke a szám előző értéke és a másikSzám szorzata lesz
-
szám /= másikSzám: a szám változó értéke a szám előző értéke és a másikSzám hányadosa lesz
-
szám %= másikSzám: a szám változó értéke a szám előző értéke és a másikSzám maradéke lesz
-
szám &= másikSzám: a szám változó értéke a szám előző értéke és a másikSzám változó közötti bitenkénti ÉS eredménye lesz
-
szám ^= másikSzám: a szám változó értéke a szám előző értéke és a másikSzám változó közötti bitenkénti KIZÁRÓ VAGY eredménye lesz
-
szám |= másikSzám: a szám változó értéke a szám előző értéke és a másikSzám változó közötti bitenkénti VAGY eredménye lesz
-
szám <<= másikSzám: a szám változó értéke a szám előző értéke balra léptetve másikSzám pozícióval lesz
-
szám >>= másikSzám: a szám változó értéke a szám előző értéke előjellel jobbra léptetve másikSzám pozícióval lesz
-
szám >>>= másikSzám: a szám változó értéke a szám előző értéke jobbra léptetve másikSzám pozícióval lesz
A prefix (++szám vagy ++szám) és a postfix (szám++ vagy szám--) operátorok használata mindig kockázatos, mivel a kifejezés kiértékelés során változik a változó értéke, vessünk egy pillantást az alábbi programrészletre és próbáljuk meghatározni az eredményt:
view plaincopy to clipboardprint?
-
int szám = 10;
-
System.out.println(szám++ + ++szám * ++szám + szám++);
Nos, az eredmény 179, mégpedig azért, mert az unáris operátorok az elsők a precedencia táblázatban, és kiértékelésük az elsők között történik, ebből adódóan a kifejezés a következő lesz az unáris operátorok feloldása után:
view plaincopy to clipboardprint?
-
System.out.println(10 + 12 * 13 + 13);
Ha végigkövetjük az értékadásokat, akkor láthatjuk, hogy az eredmény valóban 179.
|
| |