Precedência e associatividade do operador C#
Precedência e associatividade do operador C#
Neste tutorial, você aprenderá sobre precedência e associatividade de operadores em C#. Isso nos dará uma ideia de como uma expressão é avaliada pelo compilador C#.
Precedência do operador C#
A precedência do operador é um conjunto de regras que define como uma expressão é avaliada. Em C#, cada operador C# tem uma prioridade atribuída e com base nessas prioridades, a expressão é avaliada.
Por exemplo , a precedência da multiplicação
(*) operador é maior que a precedência da adição (+) operador. Portanto, a operação que envolve a multiplicação é realizada antes da adição. Dê uma olhada na declaração abaixo.
int x = 4 + 3 * 5;
Qual será o valor de x depois de executar esta instrução?
O operando
3 está associado a + e * . Como dito anteriormente, a multiplicação tem uma precedência maior do que a adição. Então, a operação 3 * 5 é executado em vez de 4 + 3 . O valor da variável x será 19 . Se a adição tiver uma precedência mais alta,
4 + 3 seria avaliado primeiro e o valor de x seria 35 . Tabela de Precedência do Operador
Quanto maior a precedência do operador, mais alto ele aparece na tabela
| Categoria | Operadores |
|---|---|
| Incremento e decremento do Postfix | ++, -- |
| Incremento de prefixo, decremento e unário | ++, --, +, -, !, ~ |
| Multiplicativo | *, /, % |
| Aditivo | +, - |
| Mudar | <<,>> |
| Relacional | <, <=,>,>= |
| Igualdade | ==, != |
| Bit a bit E | & |
| XOR bit a bit | ^ |
| OU bit a bit | | |
| E lógico | && |
| OU lógico | || |
| Ternário | ? : |
| Tarefa | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=,>>= |
Os operadores de atribuição têm a precedência mais baixa, enquanto os operadores de incremento e decremento pós-fixados têm a precedência mais alta.
Exemplo 1:Precedência do 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);
}
}
}
Ao executarmos o programa, a saída será:
19 False
Vamos entender como a expressão é avaliada no programa.
A precedência de
-- e ++ é maior que * , e precedência de * é maior que - . Daí a afirmação, result1 = --a * b - ++c;
é equivalente a
result1 = ((--a)*b)-(++c);
A expressão entre parênteses é sempre avaliada primeiro, não importa qual seja a precedência dos operadores fora dela.
- No início, (--a) é avaliado resultando em
4.

- Então (++c) é avaliado resultando em
5.

- Agora, (a * b) é avaliado resultando em
24.

- Finalmente, a subtração é realizada resultando em
19.

- Daí o valor final de result1 será
19.
Na próxima expressão, a precedência de
+ é maior que >= . Então, c e um é adicionado primeiro e a soma é comparada com b para produzir false . Associatividade de operadores em C#
Na seção anterior, discutimos sobre a precedência do operador. Se dois operadores com precedência diferente forem usados, o operador com precedência mais alta será avaliado primeiro.
Mas e se ambos os operadores tiverem a mesma precedência?
Nesse caso, a expressão é avaliada com base na associatividade do operador (da esquerda para a direita ou da direita para a esquerda).
Por exemplo:
int a = 5, b = 6, c = 3; int result = a * b / c;
Aqui, ambos
* e / têm a mesma precedência. Mas como a associatividade desses operadores é da esquerda para a direita , a * b é avaliada primeiro e, em seguida, a divisão é realizada. O resultado final desta expressão será 10 . Neste exemplo em particular, a associatividade realmente não importa. Porque mesmo que a divisão fosse realizada antes da multiplicação, o resultado não seria afetado.
Vamos dar uma olhada em outro exemplo.
int a = 5, b = 6, c = 3; a = b = c;
A associatividade de
= operador é da direita para a esquerda . Então o valor de c (ou seja, 3 ) é atribuído a b , e então o valor de b é atribuído a a . Então, depois de executar esta instrução, os valores de a , b e c será 3 . A tabela abaixo mostra a associatividade dos operadores C#:
| Categoria | Operadores | Associatividade |
|---|---|---|
| Incremento e decremento do Postfix | ++, -- | Esquerda para Direita |
| Incremento de prefixo, decremento e unário | ++, --, +, -, !, ~ | Da direita para a esquerda |
| Multiplicativo | *, /, % | Esquerda para Direita |
| Aditivo | +, - | Esquerda para Direita |
| Mudar | <<,>> | Esquerda para Direita |
| Relacional | <, <=,>,>= | Esquerda para Direita |
| Igualdade | ==, != | Esquerda para Direita |
| Bit a bit E | & | Esquerda para Direita |
| XOR bit a bit | ^ | Esquerda para Direita |
| OU bit a bit | | | Esquerda para Direita |
| E lógico | && | Esquerda para Direita |
| OU lógico | || | Esquerda para Direita |
| Ternário | ? : | Da direita para a esquerda |
| Tarefa | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=,>>= | Da direita para a esquerda |
Quase todos os operadores têm associatividade da esquerda para a direita. Os operadores com associatividade da direita para a esquerda são:
- Operadores unários
- Operadores de incremento e decremento de prefixo
- Operador Ternário
- Operadores de atribuição
Exemplo 2:Associatividade 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);
}
}
}
Quando executamos o programa, a saída será:
10 a = 3, b = 3, c = 3
Linguagem C