Cálculos, comparações, incremento, decremento e precedência de operadores em C
Os operadores aritméticos realizam as quatro operações matemáticas básicas, mais o resto da divisão. Em C, eles funcionam de forma idêntica ao Java para tipos numéricos:
| Operador | Nome | Exemplo | Resultado |
|---|---|---|---|
+ |
Adição | 10 + 3 |
13 |
- |
Subtração | 10 - 3 |
7 |
* |
Multiplicação | 10 * 3 |
30 |
/ |
Divisão | 10 / 3 |
3 (inteira!) |
% |
Módulo (resto) | 10 % 3 |
1 |
#include <stdio.h>
int main() {
int a = 10, b = 3;
printf("Adição: %d\n", a + b); // 13
printf("Subtração: %d\n", a - b); // 7
printf("Multiplicação:%d\n", a * b); // 30
printf("Divisão: %d\n", a / b); // 3 (divisão inteira)
printf("Módulo: %d\n", a % b); // 1 (resto de 10 ÷ 3)
return 0;
}
Adição: 13
Subtração: 7
Multiplicação:30
Divisão: 3
Módulo: 1
/ são inteiros, C realiza divisão inteira — o resultado é truncado para o inteiro mais próximo de zero, sem arredondamento. Para obter o resultado real com casas decimais, ao menos um dos operandos precisa ser float ou double:
int a = 7, b = 2;
printf("%d\n", a / b); // 3 — divisão inteira
printf("%.1f\n", (double)a / b); // 3.5 — cast força divisão real
printf("%.1f\n", 7.0 / b); // 3.5 — literal 7.0 já é double
O operador % retorna o resto da divisão inteira. Só funciona com inteiros (int, long, etc.) — não é válido com float ou double. Ele tem usos clássicos muito importantes:
#include <stdio.h>
int main() {
// Verificar se um número é par ou ímpar
int n = 17;
if (n % 2 == 0)
printf("%d é par\n", n);
else
printf("%d é ímpar\n", n); // imprime este
// Limitar um valor a um intervalo (ex: relógio circular)
int segundos = 65;
printf("Segundos restantes: %d\n", segundos % 60); // 5
// Verificar divisibilidade
int x = 100;
if (x % 5 == 0)
printf("%d é divisível por 5\n", x); // imprime este
return 0;
}
17 é ímpar
Segundos restantes: 5
100 é divisível por 5
C (assim como Java) oferece atalhos que combinam uma operação aritmética com a atribuição do resultado à própria variável. Eles tornam o código mais conciso e são amplamente usados em loops:
| Operador | Equivalente a | Exemplo | Resultado (dado x = 10) |
|---|---|---|---|
x+=n |
x = x + n |
x += 3 |
x = 13 |
x-=n |
x = x - n |
x -= 3 |
x = 7 |
x*=n |
x = x * n |
x *= 3 |
x = 30 |
x/=n |
x = x / n |
x /= 3 |
x = 3 |
x%=n |
x = x % n |
x %= 3 |
x = 1 |
x = x + n, x+=n, o novo x é igual ao antigo x + n
x = x - n, x-=n, o novo x é igual ao antigo x - n
x = x * n, x*=n, o novo x é igual ao antigo x * n
x = x / n, x/=n, o novo x é igual ao antigo x / n
x = x % n, x%=n, o novo x é igual ao antigo x % n
#include <stdio.h>
int main() {
int saldo = 1000;
saldo += 500; // depósito
printf("Após depósito: %d\n", saldo); // 1500
saldo -= 200; // saque
printf("Após saque: %d\n", saldo); // 1300
saldo *= 2; // dobra o saldo
printf("Após dobrar: %d\n", saldo); // 2600
saldo /= 4; // divide por 4
printf("Após dividir: %d\n", saldo); // 650
return 0;
}
Após depósito: 1500
Após saque: 1300
Após dobrar: 2600
Após dividir: 650
Os operadores ++ e -- somam ou subtraem 1 de uma variável. São usados extensivamente em loops e existem em duas formas: pré-fixada e pós-fixada.
| Operador | Nome | Comportamento |
|---|---|---|
++x |
Pré-incremento | Incrementa x antes de usar o valor na expressão |
x++ |
Pós-incremento | Usa o valor atual de x na expressão e depois incrementa |
--x |
Pré-decremento | Decrementa x antes de usar o valor |
x-- |
Pós-decremento | Usa o valor atual e depois decrementa |
#include <stdio.h>
int main() {
int a = 5, b = 5;
// Pós-incremento: usa 5, depois vira 6
printf("a++: %d\n", a++); // imprime 5
printf("a agora: %d\n", a); // imprime 6
// Pré-incremento: vira 6 primeiro, depois usa 6
printf("++b: %d\n", ++b); // imprime 6
printf("b agora: %d\n", b); // imprime 6
return 0;
}
a++: 5
a agora: 6
++b: 6
b agora: 6
++ ou -- são usados sozinhos em uma linha (como em loops: i++), a diferença entre pré e pós não tem efeito prático. A distinção importa apenas quando o operador aparece dentro de uma expressão maior como printf("a: %d", a++).
Os operadores relacionais comparam dois valores e retornam um resultado booleano — em C, esse resultado é um inteiro: 1 para verdadeiro e 0 para falso. Eles são a base de toda estrutura de decisão (if) e de repetição (while, for).
| Operador | Significado | Exemplo | Resultado |
|---|---|---|---|
== |
Igual a | 5 == 5 |
1 (verdadeiro) |
!= |
Diferente de | 5 != 3 |
1 (verdadeiro) |
> |
Maior que | 5 > 8 |
0 (falso) |
< |
Menor que | 3 < 8 |
1 (verdadeiro) |
>= |
Maior ou igual a | 5 >= 5 |
1 (verdadeiro) |
<= |
Menor ou igual a | 3 <= 2 |
0 (falso) |
#include <stdio.h>
int main() {
int x = 10, y = 20;
printf("x == y: %d\n", x == y); // 0 (falso)
printf("x != y: %d\n", x != y); // 1 (verdadeiro)
printf("x < y: %d\n", x < y); // 1 (verdadeiro)
printf("x > y: %d\n", x > y); // 0 (falso)
printf("x <= y: %d\n", x <= y); // 1 (verdadeiro)
printf("x >= y: %d\n", x >= y); // 0 (falso)
return 0;
}
x == y: 0
x != y: 1
x < y: 1
x > y: 0
x <= y: 1
x >= y: 0
= versus ==: Em C, = é o operador de atribuição e == é o operador de comparação. Confundi-los é um dos erros mais comuns — e mais perigosos — em C, pois o compilador não gera erro:
int x = 5; if (x = 10) // ⚠ ATRIBUI 10 a x e testa se 10 é verdadeiro (sempre true!) printf("nunca falso\n"); if (x == 10) // ✓ COMPARA x com 10 printf("x é dez\n");O mesmo vale em Java, mas lá o compilador alerta quando um
int aparece em contexto booleano.
Quando vários operadores aparecem em uma mesma expressão, o C define uma ordem de avaliação — a precedência — semelhante à matemática (multiplicação antes da adição). Operadores com a mesma precedência são avaliados da esquerda para a direita (associatividade).
| Prioridade | Operadores | Descrição |
|---|---|---|
| 1 (maior) | ++ -- (pós) |
Incremento/decremento pós-fixado |
| 2 | ++ -- (pré) - (unário) |
Incremento/decremento pré-fixado, negação |
| 3 | * / % |
Multiplicação, divisão, módulo |
| 4 | + - |
Adição e subtração |
| 5 | < <= > >= |
Operadores relacionais de comparação de ordem |
| 6 | == != |
Igualdade e diferença |
| 7 | && |
E lógico (AND) |
| 8 | || |
OU lógico (OR) |
| 9 (menor) | = += -= ... |
Atribuição e atribuição composta |
#include <stdio.h>
int main() {
int resultado;
resultado = 2 + 3 * 4;
printf("%d\n", resultado); // 14 — * antes de +
resultado = (2 + 3) * 4;
printf("%d\n", resultado); // 20 — () força a adição primeiro
resultado = 10 - 4 - 2;
printf("%d\n", resultado); // 4 — associatividade esquerda: (10-4)-2
resultado = 10 > 5 + 3;
printf("%d\n", resultado); // 1 — 5+3=8, depois 10>8 = verdadeiro (1)
return 0;
}
14
20
4
1
Para operações além das quatro básicas — como potência, raiz quadrada, seno, logaritmo — o C fornece a biblioteca <math.h>, equivalente à classe Math do Java:
| Função em C | Equivalente em Java | Descrição |
|---|---|---|
sqrt(x) |
Math.sqrt(x) |
Raiz quadrada |
pow(x, y) |
Math.pow(x, y) |
x elevado a y |
fabs(x) |
Math.abs(x) |
Valor absoluto (double) |
abs(x) |
Math.abs(x) |
Valor absoluto (int) — requer <stdlib.h> |
ceil(x) |
Math.ceil(x) |
Teto (arredonda para cima) |
floor(x) |
Math.floor(x) |
Piso (arredonda para baixo) |
round(x) |
Math.round(x) |
Arredondamento convencional |
log(x) |
Math.log(x) |
Logaritmo natural (base e) |
log10(x) |
Math.log10(x) |
Logaritmo base 10 |
sin(x) cos(x) tan(x) |
Math.sin/cos/tan(x) |
Funções trigonométricas (x em radianos) |
#include <stdio.h> #include <math.h> // necessário para funções matemáticas int main() { double x = 9.0; printf("Raiz de %.0f: %.2f\n", x, sqrt(x)); // 3.00 printf("2 elevado a 8: %.0f\n", pow(2, 8)); // 256 printf("Teto de 4.3: %.0f\n", ceil(4.3)); // 5 printf("Piso de 4.9: %.0f\n", floor(4.9)); // 4 printf("|−7.5|: %.1f\n", fabs(-7.5)); // 7.5 return 0; }
Raiz de 9: 3.00
2 elevado a 8: 256
Teto de 4.3: 5
Piso de 4.9: 4
|−7.5|: 7.5
<math.h> diretamente pela linha de comando, é preciso adicionar o flag -lm para vincular a biblioteca matemática:gcc programa.c -o programa -lmVamos combinar operadores aritméticos e relacionais em um programa real — o cálculo do Índice de Massa Corporal (IMC):
#include <stdio.h>
#include <math.h>
int main() {
double peso, altura, imc;
printf("Digite seu peso (kg): ");
scanf("%lf", &peso);
printf("Digite sua altura (m): ");
scanf("%lf", &altura);
imc = peso / (altura * altura); // fórmula do IMC
printf("\nSeu IMC: %.2f\n", imc);
if (imc < 18.5)
printf("Classificação: Abaixo do peso\n");
else if (imc < 25.0)
printf("Classificação: Peso normal\n");
else if (imc < 30.0)
printf("Classificação: Sobrepeso\n");
else
printf("Classificação: Obesidade\n");
return 0;
}
Digite seu peso (kg): 70
Digite sua altura (m): 1.75
Seu IMC: 22.86
Classificação: Peso normal
Os operadores aritméticos e relacionais são praticamente idênticos nas duas linguagens. As diferenças estão nos detalhes de comportamento:
| Aspecto | C | Java |
|---|---|---|
Operadores aritméticos (+ - * / %) |
Idênticos | Idênticos |
Operadores relacionais (== != < > <= >=) |
Idênticos | Idênticos para primitivos; == em objetos compara referência, não valor |
Divisão inteira (7 / 2) |
3 — trunca |
3 — trunca (mesma regra) |
| Resultado de comparação | int: 0 ou 1 |
boolean: false ou true |
Inteiro em condição (if (x)) |
Válido: 0 = falso, outros = verdadeiro | Inválido: exige boolean explícito |
Atribuição composta (+= -= *=) |
Idênticos | Idênticos |
Incremento/decremento (++ --) |
Idênticos | Idênticos |
| Funções matemáticas | #include <math.h> + flag -lm |
Classe Math (nativa, sem import) |
= dentro de if |
Compilador aceita sem erro — bug silencioso | Compilador alerta (tipo incompatível com boolean) |
Teste seus conhecimentos sobre operadores aritméticos e relacionais em C: