Operátorok
Az értékadás-értékhozzárendelés operátorai
A leggyakrabban használt operátor az egyenlőségjel (=). Feladata, hogy egy változóhoz vagy bármilyen jellegű objektumhoz valamilyen kezdő, átmeneti vagy kimeneti érték legyen hozzárendelve. Egy szimpla összeadás-kódban például…
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
int eredmeny = a + b;
System.out.println(eredmeny);
}
}
Végeredmény:
3
…a 3 db int tipusú változóhoz különböző kezdőértékek lettek hozzárendelve, úgy is mondhatjuk, hogy inicializáltuk őket. Ekkor hardverügyileg a számítógépben az történt, hogy (a kód futtatásakor) a Java-fordító lefoglalt 3 db int nagyságú memóriaterületet a műveleti memóriában és feltöltötte (inicializálta) őket a megadott kezdőértékekkel.
Itt jegyzem meg, hogy a Java az inicializálást legtöbb esetben önállóan elvégzi: ekkor általában 0 értéket ad a bemeneti változó(k)nak. Programozás-technikailag azonban a biztonság kedvéért sok programozó kézzel is szokott inicializálni. (Többek közt én is: ezt láthatjuk fent az int eredmeny = 0 deklarációban.) Ennek ugyan nem sok értelme van, hacsak nem az a speciális eset, amikor a változót újrahasználjuk és az addig tárolt érték miatt esetlegesen rossz végeredményt kapunk. Erre később mutatok példát.
Érdekes programozási lehetőség az értékadás és az alapvető aritmetikai operátorok kombinációja. Például az alábbi deklaráció…
a += b
…műveletileg egyenlő az a = a + b összeadással.
public class Main {
public static void main(String[] args) {
int a = 3;
int b = 2;
System.out.println(a += b);
}
}
Végeredmény:
5
Mindezt elméletileg ki is terjeszthetjük a 4 alapműveletre, amely során…
-
a -= b egyenlő a = a – b
-
a += b egyenlő a = a + b
-
a *= b egyenlő = a * b
-
a /= b egyenlő = a / b
…ám ezek felhasználásával az alábbi kód mégis hibás eredményeket fog szolgáltatni:
public class Main {
public static void main(String[] args) {
int a = 3;
int b = 2;
System.out.println(a += b);
System.out.println(a -= b);
System.out.println(a *= b);
System.out.println(a /= b);
}
}
Végeredmény:
5
1?
6?
1.5?
Mi a hiba?
Pontosan az, amit fentebb említettem: int a változó kezdőértéke 3, ám ez folyamatosan változik, hiszen mindig eltárolja az új, aktuális értéket, ám nekünk nem erre, hanem mindig és kizárólag a kezdőértékre (int a = 3) van szükségünk. Ezt tehát reinicializálnunk kell minden egyes művelet végén. Ráadásul az osztás művelete nem fog adni egész (int) végeredményt, ezért nem egész (lebegőpontos - float) típusúként kell inicializálnunk. Íme a kissé fapados, de legalább pontos eredményeket adó megoldás (a probléma természetesen jóval hatékonyabban és elegánsabban is megoldható, itt most a cél a probléma egyszerű és olvasható szemléltetése):
public class Main {
public static void main(String[] args) {
float a = 3;
int b = 2;
System.out.println(a += b);
a = 3;
System.out.println(a -= b);
a = 3;
System.out.println(a *= b);
a = 3;
System.out.println(a /= b);
}
}
Végeredmény:
5.0
1.0
6.0
1.5
A fentiekből az is következik, hogy az értékadás sorrendje mindig és kizárólag jobbról balra történik. Az egyik fenti deklarációban például (int a = 3) a 3 lesz hozzárendelve az int a változóhoz: tehát jobbról balra. Az alábbi, futtatható Java-kódban mindezt kiválóan érzékelhetjük: az értékadás jobbról indulva „végigrohan” az összes változón, hogy végül bal oldalon int a is megkapja.
public class Main {
public static void main(String[] args) {
int a = 1, b = 2, c = 3, d = 4;
a = b = c = d;
System.out.println(a);
}
}
Végeredmény:
4
További érdekesség, ha az értékadás és a maradékképzés operátorát (%) ötvözzük egymással. Az alábbi futtatható Java-kód a következő műveletet hajtja végre:
17 / 6 = 2, maradék 5
...ahol a %= b egyenlő a = a % b művelettel:
public class Main {
public static void main(String[] args) {
int a = 17;
int b = 6;
System.out.println(a %= b);
}
}
Végeredmény:
5
Házi feladat - Az a += b művelet felhasználásával és csakis a fejezetben leírtak szerint adjuk össze a következőt: 1 + 2 + 3 + 4 + 5! A kód kissé döcögős lesz, de most építkezzünk abból, ami rendelkezésünkre áll.
A megoldás fejezete a képre kattintva érhető el.