Menu

Operadores en Java: aritméticos, de comparación, lógicos y de asignación

Cómo funcionan los operadores de Java -aritméticos, de comparación, lógicos, de asignación, de incremento y el operador ternario- además de la división entera, la precedencia y los errores típicos que pillan a los principiantes.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Qué hacen los operadores

Los operadores son los símbolos que combinan valores para calcular otros nuevos. Ya los usas de forma intuitiva (+ suma, > compara) y Java los agrupa en unas pocas familias: aritméticos, de comparación, lógicos, de asignación, y un par de especiales como el incremento y el ternario.

La mayoría de los operadores toman dos valores (uno antes y otro después del símbolo) y producen un resultado. La clave está en saber de qué tipo es ese resultado y en qué orden se aplican, que es donde tropiezan los principiantes.

Operadores aritméticos

Los cinco operadores aritméticos trabajan con números: +, -, *, / y % (resto).

El operador % es el resto tras la división: 17 % 5 es 2 porque 5 cabe en 17 tres veces y sobran 2. Es la herramienta de cada día para comprobar la divisibilidad: n % 2 == 0 es la comprobación estándar de "¿es n par?".

Ten en cuenta también que + cumple una doble función: con números suma, pero con un String a cualquiera de los lados une texto.

La primera línea se lee de izquierda a derecha: "Total: " + 3 ya es una cadena, así que el 4 se añade como texto. Envuelve la operación entre paréntesis cuando quieras que se calcule primero.

El truco de la división entera

Esta es la sorpresa más habitual de todas. Cuando ambos operandos de / son enteros, Java hace una división entera y descarta la fracción: no redondea, trunca hacia cero.

Para obtener un resultado decimal, haz que al menos un operando sea un double: o lo escribes con un .0, o haces un cast de un lado con (double). Hacer (double)(5 / 2) no ayuda, porque la división entera 5 / 2 ya ocurrió antes del cast; debes hacer el cast a un operando, no al resultado.

Operadores de comparación

Los operadores de comparación plantean una pregunta de sí/no y devuelven un boolean. Hay seis: ==, !=, <, >, <=, >=.

Fíjate en la diferencia entre = (asignación: "pon este valor aquí") y == (comparación: "¿son iguales?"). Confundirlos es un error clásico.

Una advertencia importante: == compara referencias de objetos, no contenidos. Para las cadenas, usa .equals().

Usa == para primitivos como int y boolean, y .equals() siempre que compares el contenido de objetos como String.

Operadores lógicos

Los operadores lógicos combinan valores booleanos: && (y), || (o) y ! (no). Son la forma de expresar condiciones como "es lo bastante mayor y tiene una entrada".

&& y || aplican evaluación de cortocircuito: Java deja de evaluar en cuanto la respuesta es segura. Con &&, si el lado izquierdo es false el derecho no se comprueba nunca; con ||, si el lado izquierdo es true el derecho se omite. Esto no es solo una optimización: puedes apoyarte en ello por seguridad:

if (text != null && text.length() > 0) { ... }

Si text es null, el lado izquierdo es false y text.length() no se llama nunca, evitando una NullPointerException. Invierte el orden y reventaría.

Asignación e incremento

= asigna, pero Java también tiene asignaciones compuestas que combinan una operación con la asignación: +=, -=, *=, /=, %=. Y ++ / -- suman o restan uno.

++ viene en dos variantes: postfijo (count++) devuelve el valor antiguo y luego incrementa; prefijo (++count) incrementa primero y luego devuelve el nuevo valor. La diferencia solo importa cuando usas el resultado en la misma expresión:

Cuando ++ está en su propia línea, postfijo o prefijo da igual; así que usa el que se lea con claridad y no metas incrementos dentro de expresiones más grandes.

El operador ternario

El ternario condition ? a : b es un if/else compacto que produce un valor: si la condición es true se evalúa a a, en caso contrario a b.

Brilla en asignaciones cortas de tipo uno-u-otro. Resiste la tentación de anidar ternarios dentro de ternarios: eso se vuelve ilegible enseguida, y un if/else normal es más claro.

Precedencia y paréntesis

Los operadores se aplican en un orden fijo, muy parecido al de las matemáticas: *, /, % se ligan más fuerte que + y -, que se ligan más fuerte que las comparaciones, que se ligan más fuerte que &&, y luego ||.

No necesitas memorizar la tabla completa. Cuando una expresión mezcla familias o tienes que pararte a deducir el orden, añade paréntesis: no cuestan nada y dejan la intención clara para quien lo lea después.

Siguiente: conversión de tipos

Varios de los trucos de aquí -la división entera, mezclar int y double- se reducen a los tipos. Convertir entre tipos numéricos de forma deliberada se llama casting, y de eso trata la página siguiente.

Preguntas frecuentes

¿Qué hace el operador % en Java?

% es el operador de resto (módulo): devuelve lo que sobra tras una división entera. 7 % 3 es 1, y 10 % 2 es 0. Es la forma estándar de comprobar la divisibilidad (n % 2 == 0 significa que n es par) y de acotar un valor dentro de un rango.

¿Por qué 5 / 2 da 2 en Java en lugar de 2.5?

Cuando ambos operandos son enteros, / realiza una división entera y descarta la parte fraccionaria, así que 5 / 2 es 2, no 2.5. Para obtener 2.5 necesitas que al menos un operando sea un double: escribe 5.0 / 2, 5 / 2.0, o haz un cast de un lado con (double) 5 / 2.

¿Cuál es la diferencia entre == y equals() en Java?

== compara los primitivos por valor, pero con objetos (incluido String) compara referencias: si son el mismo objeto en memoria. Para comparar el contenido de los objetos, usa .equals(). Comparar dos cadenas con == puede devolver false aunque el texto coincida, así que usa siempre "a".equals(b) para las cadenas.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR