Operátorok
Operátor-precedencia (kiértékelési sorrend)
A programozás során gyakran kell egyszerre több számítást végeznünk, párhuzamosan vele egy számításba több bemeneti adatot zsúfolnunk. Ennek problémáját már az alábbi, futtatható Java-kódban is érzékelhetjük…
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
System.out.println(a + b * c);
System.out.println((a + b) * c);
}
}
Végeredmény:
7
9
…hiszen azonos bemeneti adatokkal különböző kimeneti adatot (végeredményt) kaptunk.
Mi a probléma?
A Java-fordító helyesen jár el, amikor belső, kialakított precedenciasora (végrehajtási sorrendje) szerint először a szorzást végzi el, majd csak utána az összeadást, de meglehet, mi nem ezt a műveletet akartuk végrehajtatni.
A Java belső precedenciasorát (végrehajtási sorrendjét) zárójelezéssel tudjuk felülírni: mindig a belső zárójeles műveletek hajtódnak végre először és így haladunk kifelé.
Nézzünk erre egy jellemző példát egy futtatható Java-kód formájában! Az alapképlet egyszerű…
2 + 2 * 4 – 2 / 2
…azonban a zárójelezés variálásával igen különböző (itt négyféle) eredményt kapunk. Mivel a műveletsor osztást is tartalmaz, a biztonság kedvéért az eredménynél float adattípust használunk:
public class Main {
public static void main(String[] args) {
float eredmeny = 2 + 2 * 4 - 2 / 2;
System.out.println(eredmeny);
eredmeny = 2 + (2 * 4) - (2 / 2);
System.out.println(eredmeny);
eredmeny = (2 + 2) * (4 - 2) / 2;
System.out.println(eredmeny);
eredmeny = 2 + ((2 * 4) - 2) / 2;
System.out.println(eredmeny);
eredmeny = (2 + 2) * 4 - (2 / 2);
System.out.println(eredmeny);
}
}
Végeredmény:
9.0
9.0
4.0
5.0
15.0
Következésképpen nagyon tisztában kell lennünk azzal, hogy mit szeretnénk kiszámolni és milyen végeredményeket várunk. Az okos, figyelmes, matematikai szemléletet nem tudja helyettesíteni egyetlen jól megírt program sem.
Legvégül nézzük meg a Java belső, beépített, műveleti precedencia-sorát. A sorszám eme végrehajtási sorrend hierarchiáját jelöli:
-
a++, a--
-
++a, --a, +a, -a
-
*, /, %
-
+, -
-
<, >, <=, >=
-
==, !=
-
&&
-
||
-
=, +=, -=, *=, /=, %=