Precedencia del operador - 1

"¡Hola, Bilaabo!"

"¡Bilaabo está feliz de saludar a su amigo!"

"Hoy Bilaabo les informará sobre la precedencia de los operadores. Pero primero les informará sobre los propios operadores".

"¿Qué son esos operadores de los que hablas?"

"En realidad, ya estás familiarizado con ellos. Es posible que no sepas que se llaman operadores".

"Por ejemplo, digamos que tenemos la expresión  c = a + b; "

"Tiene dos operadores: un operador de suma y un operador de asignación".

"En otras palabras, ¿los operadores son solo signos matemáticos? ¿Como la multiplicación, la división y la suma?"

"Sí, eso es cierto. Sin embargo, hay diferencias".

"No definiré los operadores por ti: una definición no te hará más inteligente. Es mejor verlos en acción. Los operadores se pueden dividir en varios grupos, que examinaremos ahora".

1) " Operadores matemáticos "

Símbolo Ejemplo Nombre Descripción (lo que hace)
+ a + b Operador de suma Operador de suma.
- c - d Operador de resta Resta el segundo número del primero.
* a * t Operador de multiplicación Multiplica dos números.
/ a / b operador de división Divide el primer número por el segundo.
% c % d Divide el primer número por el segundo. Calcula el resto después de dividir el primer número por el segundo.
- -a menos unario Cambia el signo de la variable a su opuesto.
Más a menos y menos a más.
+ +a más unario No cambia nada. Esto se agregó para complementar el operador menos unario. Es solo por apariencia.

"Reconozco estos de la escuela. Mi firmware incluye cursos escolares".

"Pero, ¿qué pasa con ese signo de porcentaje, algún tipo de magia?"

"Es el operador " resto después de la división ". Si 11 se divide por 5, entonces obtenemos 2 y un resto de 1. Este 1 se puede obtener escribiendo 11 % 5;"

"Cuando divides números enteros en Java, el resultado también es un número entero. El resto de la operación de división simplemente se ignora. Si dividimos 8 entre 5, obtenemos 1".

Expresión Resultado
19 / 10 1 Si dividimos 19 por 10, el resultado es 1 con un resto de 9.
19 % 10 9 Si dividimos 19 por 10, el resultado es 1 con un resto de 9.
2 / 5 0 Si dividimos 2 entre 5, el  resultado es 0 con un resto de 2.
16 % 2 0 Si dividimos 16 entre 2, el resultado es 8 con un resto de 0.

"Pero, ¿para qué demonios necesitamos el resto?"

"Suponga que necesita verificar si un número entero es par. Entonces puede escribir:"

if (a % 2 == 0)

"Y si necesita verificar si b es impar, puede escribir:"

if (b % 2 == 1)

"O para comprobar si d es divisible por 3:"

if (d % 3 == 0)

"Interesante. Lo recordaré".

2)  " Operadores de comparación "

Símbolo Ejemplo Nombre Descripción (lo que hace)
< a < b Menos que Comprueba si a es menor que b.
<= c <= d Menos que o igual a Comprueba si c es menor o igual que d.
> a > b Mas grande que Comprueba si a es mayor que b.
>= c >= d Mayor qué o igual a Comprueba si c es mayor o igual que d.
== i == j es igual Comprueba si i es igual a j.
!= a != 0 No igual a Comprueba si a no es igual a cero.

"Ya uso todos estos".

"¿Y cuál es la principal diferencia entre estos operadores y los operadores matemáticos?"

"Si sumamos dos números, obtenemos un número; pero, si comparamos dos números, obtenemos verdadero o falso".

"Así es. El resultado de una comparación es un valor de " valor lógico ", que, como sabes, está representado por el tipo booleano. Hay dos posibilidades: verdadero o falso.

"Sí, todo está claro. Ya lo sé".

3) " Operadores lógicos "

Símbolo Ejemplo Nombre Descripción (lo que hace)
&& a && b Y El resultado de la expresión es verdadero solo cuando tanto a como b son verdaderos.
|| c || d O El resultado de la expresión es verdadero si a o b son verdaderos. Los dos o al menos uno.
! !a NO El resultado de la expresión es verdadero solo si a es falso.

"Los operadores lógicos solo se pueden usar con variables o expresiones booleanas".

Ejemplo Descripción
boolean a = true;
boolean b = true;if (a && b)
La condición if es verdadera si ambos valores son verdaderos.
En otras palabras, si tanto a como b son verdaderos, entonces el resultado es verdadero .
boolean a = true;
boolean b = false;if (a || b)
La condición if es verdadera si al menos un valor es verdadero.
En otras palabras, si a o b son verdaderos, entonces el resultado es verdadero .
boolean b = false;

if (!b)

La condición if es verdadera si b no es verdadera.
En otras palabras, si   b es falso , entonces el resultado es  verdadero .
int a = 2, b = 3, c = 4;

if (a < b && a < c)
if ((a < b) && (a < c))

Si a es menor que b y a es menor que c, entonces el resultado de la expresión es verdadero.
a, b y c son números enteros, pero el resultado de comparar números enteros es un valor lógico (verdadero, falso), lo que significa que podemos usar operadores lógicos.

"Ya sé todo esto".

"¿En serio? Sigamos, entonces."

4) " Operadores bit a bit "

Símbolo Ejemplo Nombre Descripción (lo que hace)
& a & b Y Y bit a bit
| c | d O O bit a bit
~ ~a NO bit a bit NO
^ a ^ b XOR Bit a bit "EXCLUSIVO O"

" Los operadores bit a bit realizan operaciones bit a bit en números enteros".

"¿Qué es eso?"

"Cada número se representa como un conjunto de bits, y luego el resultado se calcula de la siguiente manera:"

"Si el primer bit de ambos números es 1, entonces el primer bit del resultado será 1".

"Si el segundo bit de ambos números es 1, entonces el segundo bit del resultado será 1. Y así sucesivamente".

"¿Es eso cierto para todos los operadores bit a bit?"

"Es mucho más simple que eso. Un bit solo puede tener dos valores, 0 y 1, ¿verdad?"

"Bien."

"Entonces piense en 1 como verdadero y 0 como falso. Las operaciones en bits individuales serán casi idénticas a las operaciones lógicas:"

expresión lógica Expresión bit a bit
verdadero && verdadero == verdadero 1&1 == 1
verdadero && falso == falso 1&0 == 0
cierto || cierto == cierto 1|1 == 1
cierto || falso == verdadero 1|0 == 1
falso || falso = falso 0|0 == 0
!falso == verdadero ~0 == 1
!verdadero == falso ~1 == 0

"¡Oh! Eso es tan fácil".

"Sí, pero no olvide que las operaciones bit a bit usan los bits correspondientes de dos números".

"Sí, lo recuerdo: el primer bit de un número se empareja con el primer bit del segundo, y el resultado también se escribe en el primer bit. Y lo mismo ocurre con el resto de los bits".

"Así es. ¿Tienes alguna otra pregunta?"

"¿Qué pasa con el XOR y el 'o exclusivo'?"

"Es pan comido: cuando los valores son diferentes, es verdad; cuando son iguales, es falso".

expresión lógica Expresión bit a bit
verdadero XOR verdadero == falso 1 ^ 1 == 0
falso XOR falso == falso 0 ^ 0 == 0
verdadero XOR falso == verdadero 1 ^ 0 == 1
falso XOR verdadero == verdadero 0 ^ 1 == 1

Aquí hay un par de ejemplos más de operaciones bit a bit:

Ejemplo Números como bits Resultado como bits Resultado
5 & 3 0000010 1  y 0000001 1 0000000 1 1
7 & 2 000001 1 1 y 000000 1 0 00000010 2
5 | 9 00000 1 0 1  | 0000 1 00 1 00001101 13
5 ^ 9 00000 101  ^ 00001001 0000 1100 12
~9 ~ 00001001 11110110 246

"Gracias, Bilaabo. Ahora lo sé".

"Hay un grupo más de operadores bit a bit, los operadores de desplazamiento:"

5) " Operadores de turno "

Símbolo Ejemplo Nombre Descripción (lo que hace)
>> a >> b Giro a la derecha Desplaza los bits del número a hacia la derecha en b dígitos.
<< c << d Shift izquierdo Desplaza los bits del número c a la izquierda en d dígitos.
>>> a >>> 2 desplazamiento a la derecha sin firmar Desplaza los bits del número a a la derecha en 2 dígitos.

"¿Qué clase de magia callejera es esta?"

"En realidad, todo es muy simple. Échale un vistazo:"

Ejemplo Números como bits Resultado como bits Resultado
10 >> 1 0000 101 0 >> 1 00000 101 5
10 >> 2 0000 101 0 >> 2 000000 10 2
10 << 1 0000 101 0 << 1 000 101 00 20
10 << 2 0000 101 0 << 2 00 101 000 40

"Desplazar los bits de un número a la izquierda por 1 es lo mismo que multiplicar el número por 2. Desplazar por dos dígitos es equivalente a multiplicar por 4, por tres dígitos, multiplicar por 8, y así sucesivamente".

"Desplazar a la derecha corresponde a dividir por 2, 4, 8, 16, etc."

"Pero, ¿cuál es la diferencia entre los operadores >>> y >>?"

"Difieren cuando trabajan con números negativos. Esto se debe a que  los números con signo usan el bit más a la izquierda para indicar el signo. Como resultado, un número negativo deja de serlo cuando se desplaza hacia la derecha. Entonces, se les ocurrieron dos operadores diferentes. Échale un vistazo:"

Expresión Resultado Descripción
1 000 1010 >> 1 11 000 101 El número negativo permanece negativo.
Para números negativos, los bits entrantes se llenan con 1s.
1 000 1010 >> 2 111 000 10
1 000 1010 >> 3 1111 000 1
1 000 1010 >>> 1 01 000 101 El número negativo ya no es negativo. Para números negativos, los bits entrantes se llenan con ceros.
1 000 1010 >>> 2 001 000 10
1 000 1010 >>> 3 0001 000 1

"El cambio no es cíclico. Los bits que se mueven más allá del borde izquierdo o derecho del número simplemente se descartan".

6) " Operadores de asignación "

"Ya sé lo que es la asignación. Pero, ¿por qué dices 'operadores'?"

"Porque hay varios de ellos ☺"

Operador que significa
a += b; a = a + b;
a -= b; a = a - b;
a *= b; a = a * b;
a %= b; a = a % b;
a |= b; a = a | b;
a &= b; a = a & b;

"Creo que entiendes la lógica".

7) " Operadores de incremento y decremento "

Notación Ejemplo Descripción
++ a++;
++b;
Aumenta el número en 1.
-- d--;
--i;
Disminuye el número o la variable en 1.

"¿Hay alguna diferencia entre poner los dos signos menos antes o después de la variable?"

"Sí, las hay, aunque no muy grandes. Si una variable con uno de estos operadores es parte de una expresión o asignación, entonces hay diferencias. Prefiero mostrarles un ejemplo:"

Ejemplo lo que realmente sucede Descripción
int a = 3;
int b = ++a;
int a = 3;
a = a + 1;
int b = a;
a primero se incrementa en 1 y luego se usa en la expresión.
int a = 3;
int b = a++;
int a = 3;
int b = a;
a = a + 1;
a se usa primero en la expresión y luego aumenta en 1.
int a = 3;
return a++;
int a = 3;
int result = a;
a = a + 1;
return result;
La función devolverá 3, pero el valor de a se incrementará en 1.
int x = 5;
x = ++x + ++x;
int x = 5;
int a = x + 1;// The first term is 6
x = a;
int b = x + 1;// The second term is 7
x = b;
x = a + b;
El resultado aquí es 13. Primero, x aumentará en 1, y este valor reemplazará al primer término, y luego x volverá a aumentar en 1.

"¡Vaya! ¡Eso es genial!"

"Me alegra que te haya gustado. Pero, si no hay expresión o asignación, entonces no hay diferencias:"

"x++ es equivalente a x = x + 1".

"++x es equivalente a x = x + 1".

"Lo tendré en cuenta. Gracias, Bilaabo".

8)  " Operador ternario "

"Este operador no solo usa una o dos variables o expresiones. Usa tres variables o expresiones a la vez:"

Notación Código equivalente:
a ? b : c; if (a)
b
else
c
int min = a < b ? a : b; if (a < b)
min = a;
else
min = b;
return a != null ? a.length : 0; if (a != null)
return a.length;
else
return 0;

"Bueno, eso es muy conveniente".

"Sí. Y es compacto y el código es legible. ¡Disfruta usándolo!"

9) " Otro "

"No importa qué tan bien organizada esté su colección de música, todavía tiene que crear una carpeta de 'Varios'".

"Sí, cualquiera que haya tenido que categorizar la música estaría totalmente de acuerdo".

"Entonces, hay tres operadores más de los que quiero hablarles:"

Notación Ejemplo Descripción
() (a + b) * c Los paréntesis aumentan la precedencia de los operadores.
Las cosas entre paréntesis se ejecutan primero.
[] c [i] = c [i + 1]; Obtenga un elemento de matriz por índice.
. int n = a.length; El " operador punto " accede a las variables y métodos de un objeto.

"Y, por último, aquí hay una tabla que resume la precedencia de los operadores:"

Operadores Ejemplos
Precedencia más alta (los operadores se ejecutan según su orden en esta tabla)
()
[]
.
(a + b)
c [i] = c [i] + 1
++
--
~
!
+
-
i++; ++i;
--j; a--;
~c
!f
return +a;
return -a;
*
/
%
a * b
c / d
a % b
+
-
a + b
c - d
String s = "count"+"35";
>>
<<
>>>
a >> 3
b << 2
c >>> 3
<
<=
>
>=
a < b
a <= b
c > b
c >= b
==
!=
a == 3
a != 0
& a & 7
^ a ^ b
| a | b
&& (a < b) && (a < c)
|| (b != 0) || (c != 0)
? : = a > 0 ? a : -a;
=
*=, /=, %=
-=, +=
<<=. >>=, >>>=
&=, ^=. |=
Precedencia más baja (realizado en último lugar)