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 - 17
primeiro, 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 += -5
serã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