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