El orden de precedencia de los operadores determina la secuencia en que deben realizarse las operaciones cuando en una expresión intervienen operadores de distinto tipo.
Las reglas de precedencia de operadores que utiliza Java coinciden con las reglas de las expresiones del álgebra convencional. Por ejemplo:
- La multiplicación, división y resto de una operación se evalúan primero. Si dentro de la misma expresión tengo varias operaciones de este tipo, empezaré evaluándolas de izquierda a derecha.
- La suma y la resta se aplican después que las anteriores. De la misma forma, si dentro de la misma expresión tengo varias sumas y restas empezaré evaluándolas de izquierda a derecha.
A la hora de evaluar una expresión es necesario tener en cuenta la asociatividad de los operadores. La asociatividad indica qué operador se evalúa antes, en condiciones de igualdad de precedencia. Los operadores de asignación, el operador condicional (?:
), los operadores incrementales (++, --
) y el casting son asociativos por la derecha. El resto de operadores son asociativos por la izquierda, es decir, que se empiezan a calcular en el mismo orden en el que están escritos: de izquierda a derecha. Por ejemplo, en la expresión siguiente:
10 / 2 * 5;
Realmente la operación que se realiza es (10 / 2 ) * 5
, porque ambos operadores, división y multiplicación, tienen igual precedencia y por tanto se evalúa primero el que antes nos encontramos por la izquierda, que es la división. El resultado de la expresión es 25
. Si fueran asociativos por la derecha, puedes comprobar que el resultado sería diferente, primero multiplicaríamos 2 * 5
y luego dividiríamos entre 10
, por lo que el resultado sería 1. En esta otra expresión:
x = y = z = 1;
Realmente la operación que se realiza es x = (y = (z = 1))
. Primero asignamos el valor de 1
a la variable z
, luego a la variable y
, para terminar asignando el resultado de esta última asignación a x
. Si el operador asignación fuera asociativo por la izquierda esta operación no se podría realizar, ya que intentaríamos asignar a x
el valor de y
, pero y
aún no habría sido inicializada.
En la tabla se detalla el orden de precedencia y la asociatividad de los operadores que hemos comentado en este apartado. Los operadores se muestran de mayor a menor precedencia.
Operador | Tipo | Asociatividad |
---|---|---|
++ -- |
Unario, notación postfija | Derecha |
++ -- + - (cast) ! ~ |
Unario, notación prefija | Derecha |
* / % |
Aritméticos | Izquierda |
+ - |
Aritméticos | Izquierda |
<< >> >>> |
Bits | Izquierda |
< <= > >= |
Relacionales | Izquierda |
== != |
Relacionales | Izquierda |
& |
Lógico, Bits | Izquierda |
^ |
Lógico, Bits | Izquierda |
| |
Lógico, Bits | Izquierda |
&& |
Lógico | Izquierda |
|| |
Lógico | Izquierda |
?: |
Operador condicional | Derecha |
= += -= *= /= %= |
Asignación | Derecha |