C#: Operadores e expressões
1. Operadores aritméticos
Os operadores aritméticos realizam operações matemáticas básicas, incluindo adição, subtração, multiplicação, divisão e módulo.
| Operador | Nome | Exemplo | Resultado |
|---|---|---|---|
+ |
Adição | 5 + 3 |
8 |
- |
Subtração | 5 - 3 |
2 |
* |
Multiplicação | 5 * 3 |
15 |
/ |
Divisão | 7 / 2 |
3 |
% |
Módulo | 7 % 2 |
1 |
Aviso: A divisão inteira trunca a parte decimal.
7 / 2resulta em3, e não em3.5. Para obter um resultado em ponto flutuante, pelo menos um operando deve ser do tipo ponto flutuante; por exemplo,7.0 / 2resulta em3.5.
▶ Exemplo
using System;
class Program
{
static void Main()
{
int a = 17, b = 5;
Console.WriteLine($"Addition: {a} + {b} = {a + b}");
Console.WriteLine($"Subtraction: {a} - {b} = {a - b}");
Console.WriteLine($"Multiplication: {a} * {b} = {a * b}");
Console.WriteLine($"Integer division: {a} / {b} = {a / b}");
Console.WriteLine($"Floating-point division: {a * 1.0} / {b} = {a * 1.0 / b}");
Console.WriteLine($"Modulus: {a} % {b} = {a % b}");
}
}
Addition: 17 + 5 = 22
Subtraction: 17 - 5 = 12
Multiplication: 17 * 5 = 85
Integer division: 17 / 5 = 3
Floating-point division: 17 / 5 = 3.4
Modulus: 17 % 5 = 2
2. Operadores de incremento e decremento
Os operadores de incremento ++ e decremento -- aumentam ou diminuem o valor de uma variável em 1. A forma prefixada modifica o valor antes de usá-lo; a forma pós-fixada usa o valor primeiro e, em seguida, o modifica.
| Operador | Nome | Descrição |
|---|---|---|
++x |
Incremento do prefixo | Incrementar em 1 e, em seguida, usar o valor |
x++ |
Incremento pós-fixado | Use o valor e, em seguida, incremente em 1 |
--x |
Decremento com prefixo | Decrementa em 1 e, em seguida, usa o valor |
x-- |
Decremento pós-operacional | Use o valor e, em seguida, diminua em 1 |
▶ Exemplo
using System;
class Program
{
static void Main()
{
int x = 10;
int y = 10;
Console.WriteLine($"Prefix increment: ++x = {++x}, x = {x}");
Console.WriteLine($"Postfix increment: y++ = {y++}, y = {y}");
int m = 5;
int n = 5;
Console.WriteLine($"Prefix decrement: --m = {--m}, m = {m}");
Console.WriteLine($"Postfix decrement: n-- = {n--}, n = {n}");
}
}
Prefix increment: ++x = 11, x = 11
Postfix increment: y++ = 10, y = 11
Prefix decrement: --m = 4, m = 4
Postfix decrement: n-- = 5, n = 4
3. Operadores relacionais
Os operadores relacionais comparam dois valores e retornam um resultado bool (true ou false).
| Operador | Nome | Exemplo | Resultado |
|---|---|---|---|
== |
Igual a | 5 == 5 |
true |
!= |
Diferente de | 5 != 3 |
true |
< |
Menos que | 3 < 5 |
true |
> |
Maior que | 5 > 3 |
true |
<= |
Menor ou igual a | 5 <= 5 |
true |
>= |
Maior ou igual a | 5 >= 6 |
false |
Dica: Não confunda
=(atribuição) com==(verificação de igualdade). Usar=em uma condiçãoifcausa um erro de compilação ou um bug lógico.
4. Operadores lógicos
Os operadores lógicos combinam expressões booleanas. O C# utiliza && e || com avaliação de curto-circuito, o que significa que o segundo operando não é avaliado quando o resultado já está determinado.
| Operador | Nome | Exemplo | Descrição |
|---|---|---|---|
&& |
E lógico | a && b |
Verdadeiro se ambos forem verdadeiros (curto-circuito) |
| ` | ` | OU lógico | |
! |
NÃO lógico | !a |
Nega o valor |
Atenção: Use
&&e||para operações lógicas em C#, e não&e|. Estes últimos são operadores bit a bit que também podem operar sobre valores booleanos, mas não realizam curto-circuito.
▶ Exemplo
using System;
class Program
{
static void Main()
{
int age = 25;
bool hasLicense = true;
bool canDrive = age >= 18 && hasLicense;
Console.WriteLine($"Can drive: {canDrive}");
bool isWeekend = false;
bool isHoliday = true;
bool dayOff = isWeekend || isHoliday;
Console.WriteLine($"Day off: {dayOff}");
bool isRaining = true;
Console.WriteLine($"Not raining: {!isRaining}");
}
}
Can drive: True
Day off: True
Not raining: False
5. Operadores de atribuição
Os operadores de atribuição atribuem valores às variáveis. Os operadores de atribuição compostos combinam uma operação e uma atribuição em uma única etapa.
| Operador | Equivalente | Exemplo |
|---|---|---|
= |
x = 10 |
|
+= |
x = x + y |
x += 5 |
-= |
x = x - y |
x -= 3 |
*= |
x = x * y |
x *= 2 |
/= |
x = x / y |
x /= 4 |
%= |
x = x % y |
x %= 3 |
6. Operador condicional
O operador condicional ?: é o único operador ternário do C#. Ele retorna um dos dois valores, dependendo de uma condição.
Sintaxe: condition ? valueIfTrue : valueIfFalse
▶ Exemplo
using System;
class Program
{
static void Main()
{
int score = 72;
string result = score >= 60 ? "Pass" : "Fail";
Console.WriteLine($"Score {score}: {result}");
int a = 15, b = 9;
int max = a > b ? a : b;
Console.WriteLine($"Larger value: {max}");
}
}
Score 72: Pass
Larger value: 15
7. Operador de coalescência de nulos
O operador ?? retorna o operando da direita quando o operando da esquerda é null; caso contrário, retorna o valor da esquerda. O operador ??= (C# 8) é o operador de atribuição com coalescência nula, que atribui um valor somente quando a variável é nula.
using System;
class Program
{
static void Main()
{
string name = null;
string display = name ?? "Anonymous";
Console.WriteLine($"Name: {display}");
int? count = null;
int total = count ?? 0;
Console.WriteLine($"Total: {total}");
string title = null;
title ??= "Default Title";
Console.WriteLine($"Title: {title}");
title ??= "New Title";
Console.WriteLine($"Title: {title}");
}
}
Name: Anonymous
Total: 0
Title: Default Title
Title: Default Title
8. Operador condicional nulo
O operador ?. verifica se um objeto é nulo antes de acessar um membro. Se o objeto for nulo, a expressão retorna nulo em vez de lançar uma exceção NullReferenceException.
using System;
class Program
{
static void Main()
{
string text = "Hello C#";
Console.WriteLine($"Length: {text?.Length}");
text = null;
Console.WriteLine($"Length: {text?.Length}");
int? len = text?.Length;
Console.WriteLine($"Type: {len?.GetType().Name ?? "null"}");
}
}
Length: 8
Length:
Type: null
9. Precedência dos operadores
A tabela abaixo lista os operadores comuns do C#, ordenados da maior para a menor precedência. Os operadores na mesma linha têm a mesma precedência.
| Prioridade | Operadores | Descrição |
|---|---|---|
| 1 | x++ x-- . ?. () [] |
Postfix, acesso de membros |
| 2 | ++x --x +x -x ! ~ |
Prefixo, unário |
| 3 | * / % |
Multiplicativo |
| 4 | + - |
Aditivo |
| 5 | < > <= >= is as |
Relacional, verificação de tipos |
| 6 | == != |
Igualdade |
| 7 | && |
E lógico |
| 8 | ` | |
| 9 | ?? ??= |
Coalescência de nulos |
| 10 | ?: |
Condicional |
| 11 | = += -= *= /= %= etc. |
Tarefa |
Dica: Em caso de dúvida sobre a precedência, use parênteses
()para deixar clara a ordem de avaliação. Isso evita erros e melhora a legibilidade.
❓ Perguntas Frequentes
P: Qual é a diferença entre a divisão de números inteiros e a divisão de números de ponto flutuante? R: A divisão de números inteiros trunca a parte decimal; por exemplo,
7 / 2resulta em3; a divisão em ponto flutuante preserva as casas decimais; por exemplo,7.0 / 2resulta em3.5.
P: Qual é a diferença entre
++xex++? R:++xprimeiro incrementa e retorna o novo valor;x++retorna o valor atual e, em seguida, incrementa. Em uma instrução isolada, eles se comportam da mesma forma, mas dentro de uma expressão os resultados diferem.
P: Qual é a diferença entre
&&e&? R:&&é um AND lógico de curto-circuito que ignora o operando direito quando o esquerdo é falso;&é um AND bit a bit que também pode operar com valores booleanos, mas sempre avalia ambos os lados.
P: Quando devo usar
??em vez de?.? R: Use??para fornecer um valor padrão quando o valor for nulo; use?.para acessar com segurança um membro de um objeto potencialmente nulo, evitando a exceção NullReferenceException.
📖 Resumo
- Os operadores aritméticos realizam cálculos matemáticos; observe que a divisão inteira trunca as casas decimais
- Os operadores de incremento e decremento possuem formas prefixadas e pós-fixadas que diferem quanto ao momento da avaliação
- Os operadores relacionais retornam valores
boolpara a lógica condicional - Os operadores lógicos
&&e||suportam avaliação por curto-circuito - Os operadores de atribuição compostos combinam uma operação com uma atribuição
- O operador condicional
?:é uma expressão de seleção ternária concisa ??fornece um valor padrão para null,?.acessa membros com segurança e??=atribui valores apenas quando o valor é null- Ordem de precedência, da mais alta à mais baixa: pós-fixo -> unário -> multiplicativo -> aditivo -> relacional -> igualdade -> AND lógico -> OR lógico -> coalescência de nulos -> condicional -> atribuição
📝 Exercícios
- Escreva um programa que calcule
7 / 2e7.0 / 2e exiba os resultados, verificando o comportamento de truncamento da divisão de números inteiros. - Escreva um programa que demonstre a diferença entre
++xex++em uma expressão: definaint a = 5e, em seguida, calcule++a * 3ea++ * 3separadamente e exiba os resultados. - Escreva um programa que utilize o operador condicional para determinar se um número inteiro é positivo, zero ou negativo (é permitido o aninhamento
?:). - Escreva um programa que crie uma variável
stringdefinida comonulle, em seguida, utilize??e?.para exibir seu valor padrão e acessar seu comprimento com segurança. - Escreva um programa que calcule
2 + 3 * 4e(2 + 3) * 4, demonstrando como os parênteses afetam a precedência.