Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Operadores de atribuição
  2. Operadores aritméticos
  3. Operadores lógicos
  4. Operadores relacionais
  5. Operadores bit-a-bit
  6. Operador nameof
  7. Operador sizeof
  8. Operador typeof
  9. Operador ??
  10. Operador ??
  11. Outros operadores
  12. Operadores literais
  13. operadores nullable
  14. sizeof: struct , objeto
  15. nameof: struct , enum
  16. !range(..), ?[] e =>
  17. Precedência de operadores

Para declararmos expressões em qualquer linguagem de programação precisamos utilizar os operadores. Os conceitos de expressões e operadores foram vistos em Portugol: Expressões e Operadores e Tutorial C: Operadores. Em caso de dúvida é recomendada a leitura.

A linguagem C# utiliza os mesmos operadores básicos da linguagem C/C++, com exceções, para criarmos expressões dos tipos aritméticas, lógicas e relacionais bit-a-bit e outras. Nesta seção vamos discutir sobre esses operadores.

Em P.O.O: Sobrescrita de operadores, vamos aprender a sobrescrever alguns desses operadores para adquirirem um comportamento específico para nossas classes.

Os operadores relacionais que podem ser utilizados como os comandos de repetição e decisão podem ser vistos em C# : Comandos.

Para atribuirs valores à variáveis, C# utiliza a tabela de operadores de atribuição abaixo:

Tab. 1: Operadores de Atribuição
Operador Descrição
= Atribuição
+= Atribuição acumulativa de adição
-= Atribuição acumulativa de subtração
*= Atribuição acumulativa de multiplicação
%= Atribuição acumulativa de Módulo
/= Acumulação de divisão
|= Acumulação de OU bit-a-bit
&= Acumulação de E bit-a-bit
^= Acumulação de Ou-Exclusivo bit-a-bit
<<= Acumulação de deslocamento
>>= Acumulação de deslocamento
Sintaxe
variavel1 operador= valor | expressão

variavel = valor | expressão
Exemplo 1
using System;
public class Program
{
	public static void Main()
	{
		int valor = 8;
		int valor2 = 2;

		valor += valor2;
		Console.WriteLine(valor);
		valor -= valor2;
		Console.WriteLine(valor);
		valor *= valor2;
		Console.WriteLine(valor);
		valor /= valor2;
		Console.WriteLine(valor);
		valor %= valor2;
		Console.WriteLine(valor);
		valor |= valor2;
		Console.WriteLine(valor);
		valor &= valor2;
		Console.WriteLine(valor);
		valor ^= valor2;
		Console.WriteLine(valor);
		valor >>= valor2;
		Console.WriteLine(valor);
		valor <<= valor2;
		Console.WriteLine(valor);
	}
}
Saída
10
8
16
8
0
2
2
0
0
0

Para declaração de expressões aritméticas, utilizamos os operadores abaixo fornecidos pela linguagem C#:

Tab. 2: Operadores Aritméticos
Operador Descrição
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Módulo
++ Incremento
-- Decremento

Os operadores -- e ++ utilizados antes ou depois da variável são chamados pré/pós increment e pre/pós decremento. O funcionamento desses, foi visto em Portugol: Operadores Aritméticos.

Sintaxe
valor1 operador valor2

++variavel

variavel++

--variavel

variavel--
Exemplo 2
using System;
public class Program
{
	public static void Main()
	{
		int valor1 = 1;
		int valor2 = 2;

		int valor = valor1 + valor2;
		Console.WriteLine(valor);
		valor = valor1  - valor2;
		Console.WriteLine(valor);
		valor = valor1 * valor2;
		Console.WriteLine(valor);
		valor = valor1 / valor2;
		Console.WriteLine(valor);
		valor = valor1++;
		Console.WriteLine(valor);
		valor = --valor2;
		Console.WriteLine(valor);
		valor = ++valor1;
		Console.WriteLine(valor);
		valor = valor2--;
		Console.WriteLine(valor);
	}
}
Saída
3
-1
2
0
1
1
3
1

Para ajudar na tomada de decisões, a linguagem C# fornece os operadores relacionais listados abaixo. Estes operadores retorna true ou false.

Tab. 3: Operadores Relacionais
Operador Descrição
== Igual
>= Maior ou igual
<= Menor ou igual
!= Diferente
> Maior
< Menor
Sintaxe
valor1 operador valor2
Exemplo 3
using System;
public class Program
{
	public static void Main()
	{
		int valor1 = 1;
		int valor2 = 2;

		bool valor = valor1 == valor2;
		Console.WriteLine(valor);
		valor = valor1  > valor2;
		Console.WriteLine(valor);
		valor = valor1 < valor2;
		Console.WriteLine(valor);
		valor = valor1 >= valor2;
		Console.WriteLine(valor);
		valor = valor1 <= valor2;
		Console.WriteLine(valor);
		valor = valor1 != valor2;
		Console.WriteLine(valor);
	}
}
Saída
False
False
True
False
True
True

Para entendermos sobre a aplicação dos operadores lógicos é importante entender sobre tabela verdade que foi explicado em Portugol: Operadore Lógicos e Tutorial C: Operadores Lógicos. Esse operadores retornam um valor true or false e também usado em conjunto como comandos de decisão, por exemplo.

Tab. 4: Operadores Lógicos
Operador Significado
&& E lógico
! Não lógico
|| OR lógico
Sintaxe
valor1 operador valor2
Exemplo 4
using System;
public class Program
{
	public static void Main()
	{
		bool valor1 = false;
		bool valor2 = true;
		bool valor = valor1 && valor2;
		Console.WriteLine(valor);
		valor = valor1 || valor2;
		Console.WriteLine(valor);
		valor = !valor1;
		Console.WriteLine(valor);
	}
}
Saída
False
True
True

Os operadores bitwise são operadores que realizam operações lógicas em todos os bits de um variável ou expressão para manipulação de bits e bytes. Esse operadores retornam 0 ou 1, exceto pelo operadores de deslocamento.

O uso dos operadores bit-a-bit já foi estudado em Tutorial C: Operadores bit-a-bit . É importante entender sobre a tabela verdade que foi explicada em Portugol: Operadores Lógicos e Tutorial C: Operadores Lógicos.

Tab. 5: Operadores Bit-a-bit/Bitwise
Operador Descrição
& E bit-a-bit
| OR bit-a-bit
^ Ou Exclusivo
~ Não bit-a-bit
>> Desloca N bits à direita
<< Desloca N bits à esquerda
Sintaxe
valor1 operador valor2
~valor
Exemplo 5
using System;
public class Program
{
	public static void Main()
	{
		int valor = 8,	valor2;

		valor = valor >> 1;
		Console.WriteLine(valor);
		valor = valor << 1;
		Console.WriteLine(valor);
		valor = valor & 2 ;
		Console.WriteLine(valor);
		valor = valor | 2;
		Console.WriteLine(valor);
		valor = valor ^ 4;
		Console.WriteLine(valor);
		valor = ~valor;
		Console.WriteLine(valor);
	}
}
Saída
4
8
0
2
6
-7

O operador nameof utilizado para retornar o nome de uma variável, tipo de dado ou membro como atributos, propriedades e métodos.

Sintaxe
string nameof(elemento);

Esse operador é útil quando precisamos recuperar os nomes de identificadores para algum tipo de exibição, log ou debug sem a necessidade de recorrer ao uso da classe Type ou Reflection, por exemplo.

Exemplo 6
using System;

public class Teste
{
	public int atributo;
	public int Propriedade;
	public void metodo(){}
}

public class HelloWorld 
{	
   static void Main() 
  {  
	int _var = 1;
	Teste tst = new Teste();
	   
	Console.WriteLine(nameof(_var));
	Console.WriteLine(nameof(System.Convert));
	Console.WriteLine(nameof(tst.atributo));
	Console.WriteLine(nameof(tst.Propriedade));
	Console.WriteLine(nameof(tst.metodo));
  }
}
Saída
_var
Convert
atributo
Propriedade
metodo

Os assuntos classes, objetos e instâncias serão vistos com mais detalhes em C#: POO > Classe.

O operador typeof é usado para recuperar o tipo de dado. Porém, não é permitido o uso de variável como argumento para descobrir dinamicamente o tipo de uma variável ou objeto declarado com var ou dynamic, por exemplo.

Sintaxe
Type tipo = typeof(<nome_tipo>);
Exemplo 7
using System;

class OlaMundo 
{
  static void Main() 
  {
    Console.WriteLine(typeof(uint));
    Console.WriteLine(typeof(char));
  }
}
Saída
System.UInt32
System.Char

Há uma outra forma de recuperar o tipo de dado e também outras informações de um objeto que pode ser vista em Reflection.

O operador sizeof é utilizado para recuperar a quantidade de bytes, em memória, utilizada por um tipo de dado primitivo com Int32, char ou outro.

Sintaxe
int sizeof(<nome_tipo>);
Exemplo 8

class OlaMundo 
{
  static void Main() 
  {
    Console.WriteLine(sizeof(uint));
    Console.WriteLine(sizeof(char));
    Console.WriteLine(sizeof(byte));
  }
}
Saída
4
2
1

Esse operador é útil em situações em que precisamos manipular dados que necessitam seguir tamanhos pré definidos baseados nos tipos primitivos.

O operador ?? presente em C# verifica se um valor(nullable), primitivo ou definido pelo usuário(Objeto), é não-nulo. Caso a verificação seja verdadeira(true) o valor validado é retornado, caso contrário, um outro valor definido é retornado.

Sintaxe
valor_nullable ?? valor_retorno

Esse operador ?? substitui o trecho de código(if ou ?:) abaixo, reduzindo assim o número de linhas para a atribuição e validação.

Exemplo 9: sem ??
using System;

class HelloWorld
{
  static void Main() 
  {
	    int? codigo = null;
	  
	    int a = 0;
               //sem uso de ??
	    if(codigo != null)
                {
		a = codigo;
                }
	    else
                {
		a = -1;
	    }
	    Console.WriteLine("{0}",a);
  }
}
Saída
-1

Com o uso do operador ??, podemos escrever o mesmo trecho de código(if) de forma mais resumida:

Exemplo 10: com ??
using System;

class HelloWorld
{
  static void Main() 
  {
	    int? codigo = null;
	    int a = codigo ?? -1;  
	    Console.WriteLine("{0}",a);
  }
}
Saída
-1

O operador ??= verifica se um valor(nullable) é nulo. Caso a verificação seja verdadeira(true) um valor é atribuído.

Sintaxe
valor_nullable ??= valor_retorno

O operador ??= pode ser usado para substituir o trecho de código(if) abaixo, reduzindo assim o número de linhas para a atribuição e validação.

Exemplo 11: sem ??=
using System;

class HelloWorld
{
  static void Main() 
  {
		int? codigo = null;
	    
	    //sem ??=
	    if (codigo == null)
		{
			codigo = -1;
		}
	    
	  	Console.WriteLine("{0}",codigo);
  }
}
Saída
-1

Com o uso do operador ??=, podemos escrever o mesmo trecho de código(if) de forma mais resumida:

Exemplo 12: com ??=
using System;

class HelloWorld
{
  static void Main() 
  {
		int? codigo = null;
	    
	    codigo ??= -1;
	  
	  	Console.WriteLine("{0}",codigo);
  }
}
Saída
-1

Além dos operadores listados acima, a linguagem C# possui um outro conjunto de operadores que podem ser conferidos abaixo. Em futuras atualizações atualizações cada um deles estarão em alguma seção do tutorial.

Tab. 6: Outros operadores - Em construção
Operador Descrição
?? null-coalescing
? Nullable
as Casting
is Checagem de tipo
=> Expressão lambda
:: Namespace
.. Intervalo
?: if ternário
?. -
[] Indexador
?[] -
() -
^ -
. acesso de membro
* Ponteiro
-> Ponteiro
typeof Tipo de dado
sizeof Tamanho do tipo de dado
stackalloc -
with -
delegate Referencia para método
??= -
nameof nome de identificador
Sintaxe
-
Exemplo 13
using System;
public class Program
{
	public static void Main()
	{
		int? valor = null; //nullable

		Console.WriteLine(valor is null); //is
		Console.WriteLine(valor ??= 0);
		Func<int,int,int> soma = (x,y) => (x + y); 
		Console.WriteLine(soma(10,10));
	}
}
Saída
True
0
20
  1. 16/06/2026 - revisão 4 - Adição: Operadores ?? e ??=; Correção: sizeof e links tab. 6
  2. 03/12/2025 - revisão 3 - Adição: nameof, typeof e sizeof
  3. 05/08/2025 - revisão 2 - Ajustes: target de links internos, intro, 'Objetivos' e sintaxes
  4. 15/10/2024 - revisão 1 - Correção: links portugol, exemplos; Correções gramaticais pontuais
  5. 06/03/2024 - versão inicial