Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

Operadores e expressões: a ordem em que a conta acontece

Aritméticos, relacionais e a precedência que muda o resultado: a mesma expressão avaliada no papel em subexpressões numeradas e depois no Node.

Rodolfo Mori4 min de leitura

Expressão é uma parte do algoritmo que pode ser reduzida a um valor. Operadores dizem como combinar os valores; precedência decide qual combinação acontece primeiro. Prever essa ordem no papel evita corrigir a conta por tentativa.

Vamos calcular o preço final de um pedido de material escolar. Antes de usar símbolos, confirme os tipos na lição de variável e tipo de dado: preço e quantidade são números, enquanto comparações produzem booleanos.

Tudo que se reduz a um valor é expressão

Um número isolado, uma soma e uma comparação são expressões. A atribuição guarda o valor obtido:

js
const subtotal = 40 * 5;
const temFreteGratis = subtotal >= 200;

console.log(subtotal);
console.log(temFreteGratis);
console.log(typeof temFreteGratis);
200 true boolean

Pense numa bancada: cada operação pega valores, trabalha e deixa um valor no lugar. A analogia termina quando há efeitos colaterais; uma chamada de função também pode alterar estado além de produzir resultado. Nesta lição, mantemos expressões puras para enxergar a regra.

Os aritméticos e as perguntas que cada um responde

Soma, subtração, multiplicação e divisão resolvem contas conhecidas. Resto (%) responde o que sobra depois de formar grupos inteiros, e exponenciação (**) repete multiplicação:

js
console.log('soma', 17 + 5);
console.log('subtração', 17 - 5);
console.log('multiplicação', 17 * 5);
console.log('divisão', 17 / 5);
console.log('resto', 17 % 5);
console.log('potência', 2 ** 5);
soma 22 subtração 12 multiplicação 85 divisão 3.4 resto 2 potência 32

JavaScript não possui um operador separado de divisão inteira para number. Quando o requisito pede somente caixas completas, você combina divisão com Math.floor.

js
const lapis = 17;
const porCaixa = 5;
console.log('caixas completas', Math.floor(lapis / porCaixa));
console.log('lápis soltos', lapis % porCaixa);
caixas completas 3 lápis soltos 2

O quociente e o resto contam a mesma história. Se caixas * porCaixa + soltos não reconstruir o total, sua decomposição está errada.

Resto decide paridade e ciclos

Par ou ímpar é o primeiro uso conhecido: números pares deixam resto zero ao dividir por dois. O mesmo operador distribui posições num ciclo de três equipes:

js
for (let numero = 1; numero <= 6; numero += 1) {
  const paridade = numero % 2 === 0 ? 'par' : 'ímpar';
  const equipe = ['azul', 'verde', 'roxa'][(numero - 1) % 3];
  console.log(numero, paridade, equipe);
}
1 ímpar azul 2 par verde 3 ímpar roxa 4 par azul 5 ímpar verde 6 par roxa

O resto cria repetição sem copiar uma tabela infinita. Em datas e paginação, declare de onde o ciclo começa; deslocar por um muda todas as posições.

Comparação devolve verdadeiro ou falso

Os relacionais não calculam distância; respondem a uma pergunta. Valores de borda merecem atenção:

js
const idade = 18;
console.log('maior que 18', idade > 18);
console.log('maior ou igual a 18', idade >= 18);
console.log('igual a 18', idade === 18);
console.log('diferente de 18', idade !== 18);
maior que 18 false maior ou igual a 18 true igual a 18 true diferente de 18 false

Trocar > por >= muda a regra exatamente no limite. Por isso testes incluem um valor abaixo, o próprio limite e um acima. A estrutura condicional usará esse booleano para escolher um caminho.

Precedência: multiplicação acontece antes da soma

Sem parênteses, *, / e % são avaliados antes de + e -:

js
console.log(2 + 3 * 4);
console.log((2 + 3) * 4);
14 20

O primeiro caso vira 2 + 12; o segundo obriga 5 * 4. Não decore uma tabela inteira. Em regra de negócio, use parênteses para registrar a intenção e avalie de dentro para fora.

A expressão do pedido em cinco subexpressões

Considere preco * quantidade - desconto / 2 + frete, com preço 40, quantidade 5, desconto 30 e frete 4,40. O rastreio manual produz os valores que o Node confirma:

js
const preco = 40;
const quantidade = 5;
const desconto = 30;
const frete = 4.4;

const passo1 = preco * quantidade;
const passo2 = desconto / 2;
const passo3 = passo1 - passo2;
const passo4 = passo3 + frete;

console.log({ passo1, passo2, passo3, passo4 });
{ passo1: 200, passo2: 15, passo3: 185, passo4: 189.4 }

O quinto passo do papel é associar passo4 ao preço final. A tabela não “simula JavaScript por intuição”; ela segue a precedência definida pela linguagem.

Parênteses registram a regra do desconto

Se o requisito diz “somar o frete e então aplicar metade do desconto ao pedido inteiro”, a expressão precisa mudar. Compare duas intenções:

js
const subtotal = 200;
const desconto = 30;
const frete = 20;

const descontoSoNosProdutos = subtotal - desconto / 2 + frete;
const descontoNoPedidoInteiro = (subtotal + frete) - desconto / 2;

console.log(descontoSoNosProdutos);
console.log(descontoNoPedidoInteiro);
205 205

As duas deram o mesmo valor porque subtrair um desconto fixo comutou com a soma do frete. Esse resultado é um alerta didático: uma entrada só não distingue algoritmos diferentes. Troque desconto fixo por percentual para revelar a regra:

js
const subtotal = 200;
const frete = 20;
const percentual = 0.1;

console.log(subtotal * (1 - percentual) + frete);
console.log((subtotal + frete) * (1 - percentual));
200 198

Agora o teste separa os caminhos. O primeiro preserva o frete; o segundo concede desconto sobre ele.

O erro de comparar texto com número

Igualdade solta converte antes de comparar e pode esconder a entrada errada:

js
const quantidadeDigitada = '2';

console.log(quantidadeDigitada == 2);
console.log(quantidadeDigitada === 2);
console.log(Number(quantidadeDigitada) === 2);
true false true

A primeira linha parece conveniente, mas transfere a decisão de conversão para uma regra ampla da linguagem. A terceira torna a intenção explícita: converter na entrada, depois comparar tipo e valor.

Antes de encerrar, revise expressões com um teste de propriedade. O preço final não deveria diminuir quando a quantidade aumenta, a menos que uma faixa de desconto explique a mudança. O total não deveria ficar negativo quando o desconto é limitado ao subtotal. Essas afirmações capturam regras maiores que um único exemplo.

Separe também cálculo e formatação. Arredondar cada parcela pode produzir resultado diferente de somar em centavos e formatar no fim. Escolha uma política, registre a unidade e use o mesmo caminho em todos os casos. Precedência correta não compensa unidade inconsistente.

Quando uma expressão passa de uma linha legível, nomeie subexpressões pelo papel: subtotal, descontoAplicado, valorComFrete. O Node calcula igual, mas o teste de mesa passa a comparar estados com significado. Nomes intermediários são parte da prova, não desperdício de linhas.

Sua missão é escrever no papel a expressão de um pedido com subtotal, cupom percentual, taxa fixa e frete grátis acima de R$ 200. Teste 199,99, 200 e 200,01. Depois use a tabela verdade para combinar cupom e elegibilidade, confira o percurso no guia de lógica e mantenha a trilha de Lógica como índice.

  • operadores
  • expressoes
  • precedencia
  • resto da divisao
  • comparacao

Perguntas frequentes

Parênteses demais deixam a expressão errada?
Parênteses redundantes não mudam o valor, mas podem esconder a estrutura. Use-os para tornar a regra do negócio explícita, especialmente quando soma e multiplicação aparecem juntas.
Por que JavaScript tem igualdade estrita e solta?
A igualdade solta converte tipos antes de comparar. Para lógica previsível, prefira a estrita, que só retorna true quando tipo e valor correspondem.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em Node v26.3.0, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. ECMAScript — Multiplicative Operators — tc39.es
  2. ECMAScript — Equality Operators — tc39.es

Continue por aqui