Programar em C/Operações matemáticas (Básico)

Origem: Wikilivros, livros abertos por um mundo aberto.
Saltar para a navegação Saltar para a pesquisa

Operações matemáticas[editar | editar código-fonte]

Em C, fazer operações matemáticas simples é bastante fácil e intuitivo. Por exemplo, se quisermos que uma variável contenha o resultado da conta 123 + 912, fazemos assim:

var = 123 + 912;

Os operadores aritméticos básicos são 5: + (adição), - (subtração), * (multiplicação), / (divisão) e % (resto de divisão inteira).

Outro exemplo:

int a = 15;
int b = 72;
int c = a * b;  /* c valerá 15×72 */

Podemos usar mais de um operador na mesma expressão. A precedência é igual à usada na matemática comum:

a = 2 + 4 * 10;      /* retornará 42, o mesmo que (2 + (4 * 10)) */
a = 2 + 40 / 2 + 5;  /* retornará 27, o mesmo que (2 + (40 / 2) + 5) */

Você pode usar parênteses, como em expressões matemáticas normais:

a = (2 + 4) * 10;        /* retornará 60 */
a = (2 + 40) / (2 + 5);  /* retornará 6 */

Note que uma operação entre números inteiros sempre retornará um número inteiro. Isso é evidente para a adição, subtração e multiplicação. Mas em uma divisão de inteiros, por exemplo 3/2, a expressão retornará apenas a parte inteira do resultado, ou seja, 1.

Se quisermos um resultado não-inteiro, um dos operandos deve ser não-inteiro. Nesse exemplo, poderíamos usar 3.0/2 ou 3/2.0, ou mesmo 3./2 ou (1.0 * 3)/2, pois, em C, uma operação envolvendo um número não-inteiro sempre terá como resultado um número real.

Note que em C o separador decimal é o ponto e não a vírgula.

O seguinte exemplo poderia surpreender, pois o programa dirá que o valor de f continua sendo 3.

#include <stdio.h>

int main()
{
   int i = 5;
   int j = 2;
   float f = 3.0;
   f = f + j / i;
   printf("O valor de f é %f", f);
   return 0;
}

Mas, segundo a precedência dos operadores, j / i deveria ser calculado primeiro, e como ambos os valores são do tipo inteiro, o valor dessa expressão é zero.

É importante que você grave um arquivo .c com o código acima e execute usando o compilador para ver o funcionamento com os próprios olhos.

Abreviações[editar | editar código-fonte]

Alguns tipos de atribuições são bastante comuns, e por isso foram criadas abreviações. Por exemplo, é muito comum incrementar em uma unidade o valor de uma variável (em loops, por exemplo). Em vez de escrever var = var + 1, podemos escrever simplesmente var++. Da mesma maneira, existe o operador de decremento, que decrementa em uma unidade o valor da variável: var-- (equivalente a var = var - 1).

Os operadores de decremento e incremento também podem ser utilizados antes do nome da variável. Isso significa que estas duas instruções são equivalentes:

var++;
++var;

Agora vamos supor que você use em seu programa uma variável que aumenta de 10 em 10 unidades. É claro que usar var++ dez vezes não abreviaria nada. Em vez disso, existe a abreviação var += 10.

Genericamente, para qualquer dos cinco operadores aritméticos op, vale a abreviação:

var = var op num;
var op= num;

Ou seja, os seguintes pares são equivalentes:

x *= 12;         x = x * 12;
x /= 10;         x = x / 10;
x -= 2;          x = x - 2;
x %= 11;         x = x % 11;

Este exemplo clarifica o uso dos operadores de incremento:

#include <stdio.h>

int main()
{
   int a, b;
   a = b = 5;
   printf("%d\n", ++a + 5);
   printf("%d\n", a);
   printf("%d\n", b++ + 5);
   printf("%d\n", b);
   return 0;
}

O resultado que você deve obter ao executar o exemplo é:

11
6
10
6

Esse resultado mostra que ++var e var++ não são a mesma coisa se usados como uma expressão. Quando usamos os operadores na forma prefixal (antes do nome da variável), o valor é retornado depois de ser incrementado; na forma sufixal, o valor é retornado e depois incrementado. O mesmo vale para o operador de decremento.

E o que aconteceria se você escrevesse algo como o seguinte?

printf("%d\n", a / ++a);

A resposta é: não sabemos. Segundo o padrão C, o resultado disso é indefinido (o que significa que pode variar de um compilador para outro). Não existe uma regra sobre avaliar primeiro o numerador ou o denominador de uma fração. Ou seja, não use uma variável mais de uma vez numa expressão se usar operadores que a modificam.

Talvez você tenha achado estranha a linha:

a = b = 5;

Isso é possível porque atribuições são feitas da direita para a esquerda e uma instrução de atribuição é também uma expressão que retorna o valor atribuído. Ou seja, a expressão b = 5 retornou o valor 5, que foi usado pela atribuição a = (b = 5), equivalente a a = 5.