O Dart suporta todos os operadores listados na tabela abaixo, a tabela é ordenada por prioridade do maior ao menor
| Classificação | Operadores | Associatividade |
|---|---|---|
| Operadores unários pós-fixos | expr++ expr-- () [] ?[] . ?. ! | Sem associatividade |
| Operadores unários pré-fixos | - expr ! expr ~ expr ++ expr -- expr await expr | Sem associatividade |
| Multiplicação e divisão | * / % ~/ | Associativo à esquerda |
| Adição e subtração | + - | Associativo à esquerda |
| Deslocamento de bits | << >> >>> | Associativo à esquerda |
| AND bit a bit | & | Associativo à esquerda |
| XOR bit a bit | ^ | Associativo à esquerda |
| OR bit a bit | | | Associativo à esquerda |
| Relacional e verificação de tipo | >= > <= < as is is! | Sem associatividade |
| Comparação de igualdade | == != | Sem associatividade |
| AND lógico | && | Associativo à esquerda |
| OR lógico | || | Associativo à esquerda |
| Operador de coalescência nula | ?? | Associativo à esquerda |
| Operador ternário condicional | expr1 ? expr2 : expr3 | Associativo à direita |
| Operadores em cascata | .. ?.. | Associativo à esquerda |
| Operadores de atribuição | = *= /= += -= &= ^= etc. | Associativo à direita |
| Operador spread (ver nota) | ... ...? | Sem associatividade |
Usando os operadores acima combinados com operandos, podemos construir expressões de cálculo
Exemplos simples:
a++
a + b
a = b
a == b
c ? a : b
a is T
Abaixo um exemplo funcional completo:
void main() {
// 1. Expressão de incremento pós-fixo a++
int a = 10;
print("1. Incremento pós-fixo a++");
print("Antes do incremento a = $a");
int temp = a++; // Pega o valor primeiro, depois incrementa
print("temp (valor obtido) = $temp");
print("Após o incremento a = $a\n");
// 2. Expressão de soma a + b
int b = 20;
int soma = a + b;
print("2. Soma a + b");
print("$a + $b = $soma\n");
// 3. Expressão de atribuição a = b
a = b;
print("3. Atribuição a = b");
print("Após atribuição a = $a\n");
// 4. Comparação de igualdade a == b
bool igual = a == b;
print("4. Comparação de igualdade a == b");
print("Resultado de a == b: $igual\n");
// 5. Expressão ternária condicional c ? a : b
int c = 5;
String resultado = c > 0 ? "c é um número positivo" : "c é negativo ou zero";
print("5. Operador ternário c ? a : b");
print("Verificação c>0: $resultado\n");
// 6. Verificação de tipo a is T
dynamic valorTeste = 100;
print("6. Verificação de tipo a is T");
print("valorTeste é int: ${valorTeste is int}");
print("valorTeste é String: ${valorTeste is String}");
}
Code language: Dart (dart)
Copie o código acima e execute com o comando: dart run
Regras centrais de prioridade de operadores
1. Lógica da ordem de prioridade
A tabela de operadores tem prioridade decrescente de cima para baixo: os operadores das linhas superiores têm maior prioridade e são executados primeiro.
Exemplo: o símbolo > significa “tem maior prioridade”, não comparação de valores.
Ordem de execução: resto da divisão % > comparação de igualdade == > AND lógico &&
Desconstrução da execução da expressão n % i == 0 && d % i == 0:
- Primeiro calcula
n % i,d % i(%tem a maior prioridade) - Depois realiza as duas comparações
== - Por último executa o AND lógico central
&&

2 Função dos parênteses
Os parênteses ((n % i == 0) && (d % i == 0)) apenas melhoram a legibilidade do código, não alteram a ordem original de execução;
A versão sem parênteses n % i == 0 && d % i == 0 segue a prioridade nativa, ambos trechos têm lógica e resultados totalmente idênticos;
Observação complementar: apenas quando for necessário quebrar a prioridade padrão, os parênteses mudam a ordem de execução.
void main() {
int n = 10;
int d = 20;
int i = 2;
// Forma 1: com parênteses, legibilidade superior
if ((n % i == 0) && (d % i == 0)) {
print("Forma 1: divisível sem resto");
}
// Forma 2: sem parênteses, segue a prioridade nativa, resultado igual
if (n % i == 0 && d % i == 0) {
print("Forma 2: divisível sem resto");
}
}
Resultado da execução:
Forma 1: divisível sem resto
Forma 2: divisível sem resto