Operadores e expressões C# (referência em C#)
O C# fornece vários operadores. Muitos deles têm suporte pelos tipos internos e permitem que você execute operações básicas com valores desses tipos. Esses operadores incluem os seguintes grupos:
- Operadores aritméticos que executam operações aritméticas com operandos numéricos
- Operadores de comparação que comparam operandos numéricos
- Operadores lógicos boolianos que executam operandos lógicos com operandos
bool
- Operadores shift e bit a bit que rralizam operações de deslocamento ou bit a bit com operandos de tipos integrais:
- Operadores de igualdade que verificam se os operandos são iguais ou não
Normalmente, você pode sobrecarregar esses operadores, ou seja, especificar o comportamento do operador para os operandos de um tipo definido pelo usuário.
As expressões C# mais simples são literais (por exemplo, números inteiros e reais) e nomes de variáveis. Você pode combiná-las em expressões complexas usando operadores. O operador precedence e associativity, determinam a ordem na qual as operações em uma expressão são executadas. Você pode usar parênteses para alterar a ordem de avaliação imposta pela prioridade e pela associação dos operadores.
No código a seguir, exemplos de expressões estão no lado direito das atribuições:
int a, b, c;
a = 7;
b = a;
c = b++;
b = a + b * c;
c = a >= 100 ? b : c / 10;
a = (int)Math.Sqrt(b * b + c * c);
string s = "String literal";
char l = s[s.Length - 1];
var numbers = new List<int>(new[] { 1, 2, 3 });
b = numbers.FindLast(n => n > 1);
Normalmente, uma expressão produz um resultado e pode ser incluída em outra expressão. Uma chamada de método void
é um exemplo de uma expressão que não produz um resultado. Ele pode ser usado apenas como uma instrução, como mostra o exemplo a seguir:
Console.WriteLine("Hello, world!");
Aqui estão alguns outros tipos de expressões que o C# fornece:
Expressões de cadeia de caracteres interpoladas que fornecem sintaxe conveniente para criar cadeias de caracteres formatadas:
var r = 2.3; var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}."; Console.WriteLine(message); // Output: // The area of a circle with radius 2.3 is 16.619.
Expressões lambda que permitem criar funções anônimas:
int[] numbers = { 2, 3, 4, 5 }; var maximumSquare = numbers.Max(x => x * x); Console.WriteLine(maximumSquare); // Output: // 25
Expressões de consulta que permitem que você use recursos de consulta diretamente em C#:
var scores = new[] { 90, 97, 78, 68, 85 }; IEnumerable<int> highScoresQuery = from score in scores where score > 80 orderby score descending select score; Console.WriteLine(string.Join(" ", highScoresQuery)); // Output: // 97 90 85
Você pode usar uma definição de corpo de expressão para fornecer uma definição concisa para um método, construtor, propriedade, indexador ou finalizador.
Precedência do operador
Em uma expressão com vários operadores, os operadores com maior precedência são avaliados antes dos operadores com menor precedência. No exemplo a seguir, a multiplicação é executada primeiro porque tem uma precedência mais alta do que a adição:
var a = 2 + 2 * 2;
Console.WriteLine(a); // output: 6
Use parênteses para alterar a ordem de avaliação imposta pela precedência do operador:
var a = (2 + 2) * 2;
Console.WriteLine(a); // output: 8
A tabela a seguir lista os operadores C#, começando com a precedência mais alta até a mais baixa. Os operadores em cada linha têm a mesma precedência.
Operadores | Categoria ou nome |
---|---|
x.y, f(x), a[i], x?.y , x?[y] , x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x->y |
Primário |
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, verdadeiro e falso | Unário |
x..y | Intervalo |
switch, com | switch e expressões with |
x * y, x / y, x % y | Multiplicativo |
x + y, x – y | Aditiva |
x << y, x >> y | Shift |
x < y, x > y, x <= y, x >= y, is, as | Teste de tipo e relacional |
x == y, x != y | Igualitário |
x & y |
AND lógico booliano ou AND lógico bit a bit |
x ^ y |
XOR lógico booliano ou XOR lógico bit a bit |
x | y |
OR lógico booliano ou OR lógico bit a bit |
x && y | AND condicional |
x || y | OR condicional |
x ?? a | Operador de coalescência nula |
c ? t : f | Operador condicional |
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^= y, x <<= y, x >>= y, x ??= y, => | Declaração de atribuição e lambda |
Associação de operador
Quando os operadores têm a mesma precedência, a associação dos operadores determina a ordem na qual as operações são executadas:
- Os operadores associativos esquerdos são avaliados na ordem da esquerda para a direita. Com exceção dos operadores de atribuição e do operador de avaliação de nulo, todos os operadores binários são associativos esquerdos. Por exemplo,
a + b - c
é avaliado como(a + b) - c
. - Os operadores associativos direitos são avaliados na ordem da direita para a esquerda. Os operadores de atribuição, o operador de avaliação de nulo, lambdas e o operador condicional
?:
são associativos direitos. Por exemplo,x = y = z
é avaliado comox = (y = z)
.
Use parênteses para alterar a ordem de avaliação imposta pela associação de operador:
int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}"); // output: a = 1, b = 6
Avaliação do operando
Sem considerar a relação com a precedência e a associação de operadores, os operandos em uma expressão são avaliados da esquerda para a direita. Os exemplos a seguir demonstram a ordem em que os operadores e os operandos são avaliados:
Expression | Ordem de avaliação |
---|---|
a + b |
a, b, + |
a + b * c |
a, b, c, *, + |
a / b + c * d |
a, b, /, c, d, *, + |
a / (b + c) * d |
a, b, c, +, /, d, * |
Normalmente, todos os operandos do operador são avaliados. Alguns operadores avaliam os operandos condicionalmente. Ou seja, o valor do operando mais à esquerda de tal operador define se (ou quais) outros operandos devem ser avaliados. Esses operadores são os operadores lógicos AND (&&
) e OR (||
), o operador de avaliação de nulo??
e ??=
, os operadores condicionais nulos ?.
e?[]
e o operador condicional ?:
. Para obter mais informações, consulte a descrição de cada operador.
Especificação da linguagem C#
Para obter mais informações, confira as seguintes seções da especificação da linguagem C#: