Precedencia y asociatividad del operador C ++

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 * 6se evalúa primero.

Como resultado, la expresión anterior es equivalente a

 int x = 5 - (17 * 6);

Si deseamos evaluar 5 - 17primero, 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 -= 6se evalúa primero. Por lo tanto, a será -5
  • Luego, b += -5será 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

Articulos interesantes...