Aritmética - Detalhes
Índice
Prioridade de operadores
Suponha o seguinte trecho de código:
var x = 16 / 8 * (4 / 2);
Qual será o valor de x após executá-lo? Será 2 ou 1? Que operação é feita
primeiro?
Em Java, a ordem pela qual as operações são resolvidas é:
- Parênteses;
- Multiplicações e Divisões, na ordem em que aparecerem;
- Somas e subtrações, na ordem em que aparecerem.
- Operações relacionais (
>,<,==,!=,<=,>=);
No caso do trecho acima, a sequência seria:
16 / 8(= 2, ficando2 * (4 / 2));(4 / 2)(= 2, ficando2 * 2);2 * 2(= 4).
Ou seja, o valor final de x é 4.
Para aninhar operações, é necessário colocar mais parênteses internamente. Por exemplo:
var y = 2 + (4 * (2 - 8));
Assim, 2 - 8 será executado antes de 4 * ..., que será executado antes de
2 + ....
Quanto a operadores relacionais, para serem intuitivos, eles possuem menor prioridade para serem resolvidos. Ou seja, se for escrito:
var z = x - 2 > 1;
O valor de z será calculado na ordem:
x - 2;> 3.
Assim, a comparação fica intuitiva: x - 2 é maior que 1? Considerando x = 4
como anteriormente, o valor de z será true.
Aritmética entre inteiros
Tratando-se de operações entre dois inteiros, boa parte dos operadores é
intuitivo. Porém, qual será o resultado quando é feito 5 / 7, por exemplo? É
0.714...?
Para responder a isso, devemos saber que operações entre inteiros sempre
resultam em inteiros. Ou seja, não é possível que 5 (que é um inteiro)
divido por 7 (que é outro inteiro) resulte em 0.714..., que é um número
real! O que se faz, na prática, é contar quantas vezes é necessário multiplicar
7 para se chegar em pelo menos 5. Como 7 já é maior que 5, então é
necessário multiplicar um total de 0 vezes. No final, isso é equivalente a
ignorar os números após a vírgula, que é o que chamamos de truncar.
Sendo assim, 5 / 7 é 0 (ignora-se o .714...), 3 / 2 é 1 (ignora-se o
.5), e por aí vai.
Aritmética entre tipos diferentes
Considerando o caso visto acima em
Aritmética entre inteiros, e se for necessário
que o resultado seja um número real? Para isso, basta que pelo menos um dos
operandos seja um número real (ou seja, float ou double).
Sendo assim, basta fazer 5.0 / 7 ou 5 / 7.0. Isso se dá porque a
preferência é sempre converter os valores para o tipo mais abrangente. Nesse
caso, consideramos do menos abrangente ao mais abrangente:
- Byte;
- Short;
- Int;
- Long;
- Float;
- Double.