Operações matemáticas em C - Soma, subtração, multiplicação, divisão e módulo (ou resto da divisão) e precedência dos operadores

Operações matemáticas básicas. Fácil não?
Por exemplo, quanto é: 1 + 1 x 2 ?

Pode ser 3: 1 + (1x2) = 1 + 2 = 3
Ou pode ser 4: (1+1)x2 = 2x2= 4

Então, qual a resposta certa? Obviamente é só uma.
Para o computador, um cálculo não pode resultar em dois valores.

A resposta correta é sempre 3. Isso tem a ver com operações matemáticas e precedência em C.

Símbolos matemáticos em C

Em programação C, alguns símbolos matemáticos são que usamos em computação são diferentes daqueles que usamos no dia-a-dia. Os símbolos são os seguintes:
Soma: +
Subtração: -
Multiplicação: *
Divisão: /
Módulo ou resto da divisão: %

Como pode notar, o símbolo de multiplicação é um asterisco, e não um 'x'.
O símbolo da divisão é a mesma barra que usamos para digitar urls.
Sobre módulo (ou resto da divisão), falaremos melhor sobre esse operador matemático ainda nesse artigo de nosso curso.

A seguir, um programa que pede dois números para o usuário e mostra o resultado da soma, subtração, multiplicação e divisão do primeiro pelo segundo número.
Note que é bem simples de se entender e não há segredo:


#include <stdio.h>

int main()
{
    float num1, num2, sum, sub, mult, div;

    printf("Digite o primeiro numero: " );
    scanf("%f", &num1);

    printf("Digite o segundo numero: " );
    scanf("%f", &num2);

    //Soma
    sum = num1 + num2;

    //Subtração
    sub = num1 - num2;

    //Multiplicaçao
    mult = num1 * num2;

    //Divisão
    div = num1/num2;

    printf("%.2f + %.2f = %.2f\n", num1, num2, sum);
    printf("%.2f - %.2f = %.2f\n", num1, num2, sub);
    printf("%.2f * %.2f = %.2f\n", num1, num2, mult);
    printf("%.2f / %.2f = %.2f\n", num1, num2, div);
}


Além dos dois números que pedimos ao usuário, criamos mais 4 float para armazenar as operações matemáticas. Fizemos isso para o código ficar organizado, mas você também pode colocar essas operações direto no printf, veja como ficariam os printf:


printf("%.2f + %.2f = %.2f\n", num1, num2, num1 + num2);
printf("%.2f - %.2f = %.2f\n", num1, num2, num1 - num2);
printf("%.2f * %.2f = %.2f\n", num1, num2, num1 * num2);
printf("%.2f / %.2f = %.2f\n", num1, num2, num1 / num2);

O que é módulo ou operador resto da divisão

Vamos voltar um pouco no tempo, quando você aprendeu a fazer continhas, mais ou menos como na figura:
Aprenda tudo sobre as operações matemáticas em C - Soma, subtração, multiplicação, divisão e módulo (ou resto da divisão) e precedência dos operadores
Pois é, nesse caso o resto da divisão é o 14.
Ela é resultado da seguinte operação: 2009 % 19 = 14
Pois 2009 = 19*105 + 14

Essa operação será bastante usada no decorrer de sua vida como programador C.
Por exemplo, os números pares sempre deixa resto 0 quando divididos por 2 (consegue entender o motivo?).

Precedência dos operadores matemáticos em C

Vamos voltar ao exemplo do início de nosso tutorial: quanto seria 1 + 1 x 2
A resposta é sempre 3 pois o operador de multiplicação é mais importante que a soma.

E caso fosse: 8/4 -  2?
Pode ser: 8/4 - 2 = 2 - 2 = 0
Ou pode ser: 8/4 - 2 = 8/(4 - 2) = 8 / 2 = 4
A resposta é sempre 0, pois o operador de divisão é mais importante que o de subtração.

Mostramos esses exemplos para provar que saber a ordem (ou precedência) dos operadores é muito importante.
Embora a maioria dos cursos (alguns ditos 'bons' e famosos) simplesmente ignore isso, mas você viu que pode obter respostas totalmente diferentes.

Segue a lista dos operadores matemáticos que estudamos em nosso artigo.
A importância vai crescendo de baixo para cima e da esquerda para a direita:

*   /   %
+   -


Usando parênteses para evitar confusão com a precedência

Caso não seja muito fã ou bom em memorização, existe um recurso que você pode usar que vai deixar claro a ordem das operações, bem como deixar mais organizado seu código em C.
A regra é simples: agrupe e ponha entre parênteses o que você quer calcular.

Por exemplo, se ao invés de 1 + 1 x 2, tivéssemos escrito:
1 + (1 x 2) ?
É bem óbvio que somamos o 1 com o RESULTADO do que está entre parênteses. Ou seja, sempre é calculado primeiro o que está em parênteses:
1 + (1 x 2) = 1 + 2 = 3
(1 + 1) x 2 = 2 x 2 = 4

O outro caso 8/4 -  2, também fica bem evidente e simples de se entender apenas olhando:
(8/4) -  2 = 2 - 2 = 0
8/(4 -  2) = 8/2 = 4


E você achando que sabia as operações básicas de Matemática, hein?

7 comentários:

Apostila C Progressivo disse...

Escrever centenas de páginas e não errar, é quase impossível.
Por isso, existem um ou outro detalhe que nos passou despercebido.

Agradecemos, então, ao leitor Eduardo Saraiva, que viu uma palavra trocada e nos avisou do erro.

Quem mais notar algum erro, algo não muito bem explicado ou confuso, por favor, ajude na divulgação do conhecimento e nos indique os problemas.

Danielle Farias disse...

Onde está escrito:
(8/4) - 2 = 4 - 2 = 2

Na verdade é:
(8/4) - 2 = 2 - 2 = 0

Anônimo disse...

muito bom mesmo este curso

Mundo web disse...

Estou acompanhando o curso. só não entendi o significado de %1f,%1f ou %2f que vocês estão usando e nem qual a diferença entre double e float nos códigos,porque eu troco float por double e da errado. descobri que tem que usar o %lf pra fica certo,mas gostaria de saber o significado. acho que deve ter muita gente com a mesma dúvida, por isso acho bom vocês esclarecer essas coisas para o curso ficar ainda melhor.

thanks!

Anônimo disse...

O lf quer dizer "long float" ! É usado para armazenar quando a variável é double!

Juliana disse...

%.2f - o .2 antes do f é pra limitar o numero de casas depois do ponto (num.00), pois no float aparecem mais de duas. é uma medida estética, já que fica feio aquele monte de zeros no fim do numero! dá pra colocar quantas casas quiser: .1, .2, .3, .4....

Anônimo disse...

Ao realizar a operação:

float expressao = ((8+10)-1)/2

Teremos o resultado 8 ao invés de 8.5.

Mesmo imprimindo expressao (via printf) formatado como float, o resultado será '8.00'.

Observe que a expressão contém apenas números inteiros, ainda que a variável esteja definida como float.

Para evitar isso, deve-se converter explicitamente a expressão que está sendo calculada. Ficando desta forma:

float expressao = (float) ((8+10)-1)/2

Caso algum número na expressão seja ponto flutuante, não é necessário a conversão. Ex.:

float expressao = ((8+10)-1)/2.0

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.