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.