Aula 04 – Operadores Aritméticos e Relacionais

Cálculos, comparações, incremento, decremento e precedência de operadores em C

Operadores Aritméticos

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

Divisão inteira — cuidado fundamental: Quando ambos os operandos de / 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 módulo (%)

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

Operadores de Atribuição Composta

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

Incremento e Decremento

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

DICA prática: Quando ++ 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++).

Operadores Relacionais

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

Armadilha clássica — = 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.

Precedência de Operadores

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

DICA: Em caso de dúvida sobre a precedência, use parênteses. Além de garantir o resultado correto, eles tornam a intenção do código muito mais clara para quem vai ler depois.

Funções Matemáticas: <math.h>

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

Compilando com math.h no GCC: Ao compilar programas que usam <math.h> diretamente pela linha de comando, é preciso adicionar o flag -lm para vincular a biblioteca matemática:
gcc programa.c -o programa -lm
No Code::Blocks com MinGW, essa vinculação costuma ocorrer automaticamente.

Exemplo Completo: Calculadora de IMC

Vamos 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

Operadores em C versus Java

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)

Exercícios — Aula 04

Teste seus conhecimentos sobre operadores aritméticos e relacionais em C:

1. Qual será o resultado de 17 % 5 em C?

2. Analise o código abaixo. Qual será a saída?

int a = 5;
printf("%d\n", a++);
printf("%d\n", a);

3. Por que int a = 7; int b = 2; printf("%d", a / b); imprime 3 e não 3.5?

4. Qual será o resultado da expressão 2 + 3 * 4 - 1 em C?

5. O código abaixo tem um erro clássico. O que está errado?

int x = 5;
if (x = 0)
    printf("zero\n");
else
    printf("não zero\n");

6. Qual header deve ser incluído para usar a função sqrt() em C?

7. Qual é o valor de resultado após executar int resultado = 10; resultado %= 3;?

8. Qual é a principal diferença entre o operador == em C e em Java quando aplicado a objetos?