En este tutorial, aprenderemos sobre la precedencia y asociatividad de los operadores en C ++ con la ayuda de ejemplos.
Precedencia de operadores de C ++
Si hay varios operadores en una sola expresión, las operaciones no se evalúan simultáneamente. Más bien, los operadores con mayor precedencia tienen sus operaciones evaluadas primero.
Consideremos un ejemplo:
int x = 5 - 17 * 6;
Aquí, el operador de multiplicación *
tiene un nivel de precedencia más alto que el operador de resta -
. Por lo tanto, 17 * 6
se evalúa primero.
Como resultado, la expresión anterior es equivalente a
int x = 5 - (17 * 6);
Si deseamos evaluar 5 - 17
primero, debemos encerrarlos entre paréntesis :
int x = (5 - 17) * 6;
Ejemplo 1: precedencia de operadores
#include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )
Salida
num1 = -97 num2 = -97 num3 = -72
Nota: Debido a que hay muchos operadores en C ++ con múltiples niveles de precedencia, es muy recomendable que usemos paréntesis para hacer nuestro código más legible.
Tabla de precedencia de operadores de C ++
La siguiente tabla (tomada de cppreference.com) muestra la precedencia de los operadores de C ++. El nivel de precedencia 1 significa operadores de mayor prioridad, mientras que el nivel de precedencia 17 significa operadores de menor prioridad.
La propiedad de la asociatividad se discutirá en breve.
Precedencia | Operador | Descripción | Asociatividad |
---|---|---|---|
1 | :: | Resolución de alcance | De izquierda a derecha |
2 | a ++ a-- tipo () tipo () a () a () . -> | Incremento de sufijo / sufijo Decremento de sufijo / sufijo Función emitida Función fundida Llamada a función Subíndice Acceso a miembros desde un objeto Acceso a miembros desde objeto ptr | De izquierda a derecha |
3 | ++ a --a + a -a ! ~ (Tipo) * a & a sizeof co_await nueva nueva () Eliminar Eliminar () | Incremento de prefijo Decremento de prefijo Unario más Unario menos NOT lógico Bitwise NOT Reparto de estilo C Indirección (desreferencia) Dirección de Tamaño de expresión de espera Asignación de memoria dinámica Desasignación de memoria dinámica | De derecha a izquierda |
4 | . * -> * | Selector de objeto de miembro Selector de puntero de miembro | De izquierda a derecha |
5 | a * b a / b a% b | Módulo de división de multiplicación | De izquierda a derecha |
6 | a + b a - b | Resta de suma | De izquierda a derecha |
7 | << >> | Desplazamiento a la izquierda bit a bit Desplazamiento a la derecha bit a bit | De izquierda a derecha |
8 | <= < | Operador de comparación de tres vías | De izquierda a derecha |
9 | < <= > > = | Menor que Menor o igual que Mayor que Mayor o igual que | De izquierda a derecha |
10 | == ! = | Igual a No igual a | De izquierda a derecha |
11 | Y | Y bit a bit | De izquierda a derecha |
12 | ^ | XOR bit a bit | De izquierda a derecha |
13 | | | O bit a bit | De izquierda a derecha |
14 | && | Y lógico | De izquierda a derecha |
15 | || | OR lógico | De izquierda a derecha |
dieciséis | un ? b: c lanzar co_yield = + = - = * = / = % = << = >> = & = = | = | Ternario condicional operador de banda expresión rendimiento (C ++ 20) Asignación de asignación de suma de asignación de resta Multiplicación Asignación de asignación de división de módulo de asignación de Bitwise Shift Asignación izquierda Bitwise Shift Asignación derecho AND bit a bit de asignación de XOR bit a bit de asignación de bit a bit o asignación | De derecha a izquierda |
17 | , | Operador de coma | De izquierda a derecha |
Asociatividad de operadores C ++
La asociatividad del operador es la dirección desde la que se evalúa una expresión. Por ejemplo,
int a = 1; int b = 4; // a will be 4 a = b;
Eche un vistazo a la a = 4;
declaración. La asociatividad del =
operador es de derecha a izquierda. Por tanto, el valor de b se asigna a a, y no en la otra dirección.
Además, varios operadores pueden tener el mismo nivel de precedencia (como podemos ver en la tabla anterior). Cuando se utilizan varios operadores del mismo nivel de precedencia en una expresión, se evalúan según su asociatividad .
int a = 1; int b = 4; b += a -= 6;
Tanto los operadores +=
como los -=
operadores tienen la misma precedencia. Dado que la asociatividad de estos operadores es de derecha a izquierda, así es como se evalúa la última declaración.
a -= 6
se evalúa primero. Por lo tanto, a será -5- Luego,
b += -5
será evaluado. Por tanto, b será -1
Ejemplo 2: Asociatividad de operadores
#include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )
Salida
a = -5 b = -1