Precedência e associatividade do operador C ++

Neste tutorial, aprenderemos sobre a precedência e associatividade de operadores em C ++ com a ajuda de exemplos.

Precedência de operadores C ++

Se houver vários operadores em uma única expressão, as operações não serão avaliadas simultaneamente. Em vez disso, os operadores com maior precedência têm suas operações avaliadas primeiro.

Vamos considerar um exemplo:

 int x = 5 - 17 * 6; 

Aqui, o operador de multiplicação *tem precedência de nível mais alto do que o operador de subtração -. Portanto, 17 * 6é avaliado primeiro.

Como resultado, a expressão acima é equivalente a

 int x = 5 - (17 * 6);

Se quisermos avaliar 5 - 17primeiro, devemos colocá-los entre parênteses :

 int x = (5 - 17) * 6;

Exemplo 1: Precedência 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; )

Resultado

 num1 = -97 num2 = -97 num3 = -72

Observação: como há muitos operadores em C ++ com vários níveis de precedência, é altamente recomendável usar parênteses para tornar nosso código mais legível.

Tabela de precedência de operadores C ++

A tabela a seguir (obtida de cppreference.com) mostra a precedência dos operadores C ++. Nível de precedência 1 significa operadores de prioridade mais alta, enquanto nível de precedência 17 significa operadores de prioridade mais baixa.

A propriedade da associatividade será discutida em breve.

Precedência Operador Descrição Associatividade
1 :: Resolução de Escopo Da esquerda para direita
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Incremento de
sufixo / postfix Sufixo / decremento de postfix
Função cast
Function cast
Chamada de função
Subscrito
Acesso de membro de um objeto
Acesso de membro do objeto ptr
Da esquerda para direita
3 ++ a
--a
+ a
-a
!
~
(digite)
* a
& a
sizeof
co_await
new new ()
delete delete ()
Aumento do
prefixo Diminuição do prefixo
Unário mais
Unário menos
Lógico NOT
bit a bit NOT
C style cast
Indirecionamento (desreferência)
Endereço-de
Tamanho-da
expressão
await Alocação de
memória dinâmica Desalocação de memória dinâmica
Direita para esquerda
4 . *
-> *
Seletor de objeto de
membro Seletor de ponteiro de membro
Da esquerda para direita
5 a * b
a / b
a% b
Módulo de
Divisão de Multiplicação
Da esquerda para direita
6 a + b
a - b

Subtração de adição
Da esquerda para direita
7 <<
>>
Deslocamento à esquerda bit a
bit Deslocamento à direita bit a bit
Da esquerda para direita
8 <= < Operador de comparação de três vias Da esquerda para direita
9 <
<=
>
> =
Menor que
menor ou igual a
Maior que
maior ou igual a
Da esquerda para direita
10 ==
! =
Igual a
Diferente de
Da esquerda para direita
11 E E bit a bit Da esquerda para direita
12 ^ XOR bit a bit Da esquerda para direita
13 | OR bit a bit Da esquerda para direita
14 && E lógico Da esquerda para direita
15 || OR lógico Da esquerda para direita
16 uma ? b: c
lance
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Ternário Condicional
lançar
expressão de rendimento do operador (C ++ 20)
Atribuição
Adição Atribuição
Subtração Atribuição
Multiplicação Atribuição
Divisão Atribuição
Módulo Atribuição Atribuição
Bitwise Shift Esquerda Atribuição
Bitwise Shift Direita Atribuição
Bitwise E Atribuição
Bitwise XOR Atribuição
Bitwise OU Atribuição
Direita para esquerda
17 , Operador vírgula Da esquerda para direita

Associatividade de operadores C ++

A associatividade do operador é a direção a partir da qual uma expressão é avaliada. Por exemplo,

 int a = 1; int b = 4; // a will be 4 a = b;

Dê uma olhada na a = 4;declaração. A associatividade do =operador é da direita para a esquerda. Portanto, o valor de b é atribuído a a, e não na outra direção.

Além disso, vários operadores podem ter o mesmo nível de precedência (como podemos ver na tabela acima). Quando vários operadores do mesmo nível de precedência são usados ​​em uma expressão, eles são avaliados de acordo com sua associatividade .

 int a = 1; int b = 4; b += a -= 6;

Os operadores +=e -=operadores têm a mesma precedência. Como a associatividade desses operadores é da direita para a esquerda, aqui está como a última declaração é avaliada.

  • a -= 6é avaliado primeiro. Portanto, a será -5
  • Em seguida, b += -5serão avaliados. Portanto, b será -1

Exemplo 2: Associatividade 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; )

Resultado

 a = -5 b = -1

Artigos interessantes...