Programar em C/Operações matemáticas (Básico)
Operações matemáticas
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
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.