En este tutorial, aprenderá sobre la precedencia y la asociatividad de los operadores en C #. Esto nos dará una idea de cómo el compilador de C # evalúa una expresión.
Prioridad del operador C #
La precedencia del operador es un conjunto de reglas que define cómo se evalúa una expresión. En C #, cada operador de C # tiene una prioridad asignada y, en función de estas prioridades, se evalúa la expresión.
Por ejemplo , la precedencia del (*)
operador de multiplicación es mayor que la precedencia del (+)
operador de suma . Por tanto, la operación que implica la multiplicación se realiza antes que la suma.
Eche un vistazo a la declaración a continuación.
int x = 4 + 3 * 5;
¿Cuál será el valor de x después de ejecutar esta declaración?
El operando 3
está asociado con +
y *
. Como se dijo anteriormente, la multiplicación tiene mayor precedencia que la suma. Entonces, la operación 3 * 5
se realiza en lugar de 4 + 3
. El valor de la variable x será 19
.
Si la suma tuviera una precedencia mayor, 4 + 3
se evaluaría primero y el valor de x sería 35
.
Tabla de precedencia de operadores
Cuanto mayor sea la precedencia del operador, más alto aparecerá en la tabla
Precedencia del operador C #Categoría | Operadores |
---|---|
Incremento y decremento de sufijo | ++, - |
Prefijo Incremento, Decremento y Unario | ++, -, +, -,!, ~ |
Multiplicativo | *, /,% |
Aditivo | +, - |
Cambio | <> |
Relacional | <,,> = |
Igualdad | ==,! = |
Y bit a bit | Y |
XOR bit a bit | ^ |
O bit a bit | | |
Y lógico | && |
OR lógico | || |
Ternario | ? : |
Asignación | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Los operadores de asignación tienen la precedencia más baja mientras que los operadores de incremento y decremento de sufijo tienen la precedencia más alta.
Ejemplo 1: precedencia del operador
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int result1; int a = 5, b = 6, c = 4; result1 = --a * b - ++c; Console.WriteLine(result1); bool result2; result2 = b>= c + a; Console.WriteLine(result2); ) ) )
Cuando ejecutamos el programa, la salida será:
19 falso
Entendamos cómo se evalúa la expresión en el programa.
La precedencia de --
y ++
es mayor que *
, y la precedencia de *
es mayor que -
. De ahí la declaración,
resultado1 = --a * b - ++ c;
es equivalente a
resultado1 = ((--a) * b) - (++ c);
La expresión entre paréntesis siempre se evalúa primero, sin importar la precedencia de los operadores fuera de ella.
- Al principio, (--a) se evalúa dando como resultado
4
. - Entonces (++ c) se evalúa dando como resultado
5
. - Ahora, (a * b) se evalúa dando como resultado
24
. - Finalmente, se realiza la resta dando como resultado
19
. - Por tanto, el valor final de result1 será
19
.
En la siguiente expresión, la precedencia de +
es mayor que >=
. Entonces, primero se suman cy a y la suma se compara con b para producir false
.
Asociatividad de operadores en C #
En la sección anterior, discutimos sobre la precedencia de los operadores. Si se utilizan dos operadores con diferente precedencia, primero se evalúa el operador con mayor precedencia.
Pero, ¿y si ambos operadores tienen la misma precedencia?
En tal caso, la expresión se evalúa basándose en la asociatividad del operador (de izquierda a derecha o de derecha a izquierda).
Por ejemplo:
int a = 5, b = 6, c = 3; int resultado = a * b / c;
Aquí, ambos *
y /
tienen la misma precedencia. Pero como la asociatividad de estos operadores es de izquierda a derecha , a * b
primero se evalúa y luego se realiza la división. El resultado final de esta expresión será 10
.
En este ejemplo en particular, la asociatividad realmente no importa. Porque incluso si la división se realizara antes de la multiplicación, el resultado no se vería afectado.
Echemos un vistazo a otro ejemplo.
int a = 5, b = 6, c = 3; a = b = c;
La asociatividad del =
operador es de derecha a izquierda . Entonces, el valor de c (es decir 3
) se asigna a b, y luego el valor de b se asigna a a. Entonces, después de ejecutar esta declaración, los valores de a, byc serán 3
.
La siguiente tabla muestra la asociatividad de los operadores de C #:
Asociatividad de operadores en C #Categoría | Operadores | Asociatividad |
---|---|---|
Incremento y decremento de sufijo | ++, - | De izquierda a derecha |
Prefijo Incremento, Decremento y Unario | ++, -, +, -,!, ~ | De derecha a izquierda |
Multiplicativo | *, /,% | De izquierda a derecha |
Aditivo | +, - | De izquierda a derecha |
Cambio | <> | De izquierda a derecha |
Relacional | <,,> = | De izquierda a derecha |
Igualdad | ==,! = | De izquierda a derecha |
Y bit a bit | Y | De izquierda a derecha |
XOR bit a bit | ^ | De izquierda a derecha |
O bit a bit | | | De izquierda a derecha |
Y lógico | && | De izquierda a derecha |
OR lógico | || | De izquierda a derecha |
Ternario | ? : | De derecha a izquierda |
Asignación | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | De derecha a izquierda |
Casi todos los operadores tienen asociatividad de izquierda a derecha. Los operadores que tienen asociatividad de derecha a izquierda son:
- Operadores unarios
- Operadores de incremento y decremento de prefijo
- Operador ternario
- Operadores de Asignación
Ejemplo 2: asociatividad de operadores
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int a = 5, b = 6, c = 3; int result = a * b / c; Console.WriteLine(result); a = b = c; Console.WriteLine("a = (0), b = (1), c = (2)", a, b, c); ) ) )
Cuando ejecutamos el programa, la salida será:
10 a = 3, b = 3, c = 3