Operadores compostos Java
*1. Visão geral *
Neste tutorial, veremos os operadores compostos Java, seus tipos e como o Java os avalia.
Também explicaremos como a transmissão implícita funciona.
===* 2. Operadores de atribuição composta *
Um operador de atribuição é um operador binário que atribui o resultado do lado direito à variável do lado esquerdo. O mais simples é o operador de atribuição _ “=” _:
int x = 5;
Esta declaração declara uma nova variável x, atribui x o valor de 5 e retorna 5.
*Operadores de atribuição compostos são uma maneira mais curta de aplicar uma operação aritmética ou bit a bit e atribuir o valor da operação à variável no lado esquerdo.*
Por exemplo, as duas instruções de multiplicação a seguir são equivalentes, o que significa que a e b terão o mesmo valor:
int a = 3, b = 3, c = -2;
a = a *c;//Simple assignment operator
b* = c;//Compound assignment operator
É importante observar que a variável à esquerda de um operador de atribuição composta já deve estar declarada. Em outras palavras, operadores compostos não podem ser usados para declarar uma nova variável.
Como o operador de atribuição "=", os operadores compostos retornam o resultado atribuído da expressão:
long x = 1;
long y = (x+=2);
X e y manterão o valor 3.
A atribuição _ (x + = 2) _ faz duas coisas: primeiro, adiciona 2 ao valor da variável x, que se torna 3; _ segundo, retorna o valor da atribuição, que também é _3.
*3. Tipos de operadores de atribuição composta *
Java suporta 11 operadores de atribuição composta. Podemos agrupá-los em operadores aritméticos e bit a bit.
Vamos examinar os operadores aritméticos e as operações que eles executam:
-
Incrementação: _ + = _
-
Decrementação: _- = _ Multiplicação: _ = _
-
Divisão: _/= _
-
Módulo: _% = _
Então, também temos os operadores bit a bit:
-
AND, binário: _ & = _
-
OR exclusivo, binário: _ ^ = _
-
OR inclusivo, binário: _ | = _
-
Deslocamento à esquerda, binário: _ << = _
-
Deslocamento à direita, binário: _ >> = _ *Deslocar o preenchimento zero à direita: _ >>> = _
Vamos dar uma olhada em alguns exemplos dessas operações:
//Simple assignment
int x = 5;//x is 5
//Incrementation
x += 5;//x is 10
//Decrementation
x -= 2;//x is 8
//Multiplication
x* = 2;//x is 16
//Modulus
x %= 3;//x is 1
//Binary AND
x &= 4;//x is 0
//Binary exclusive OR
x ^= 4;//x is 4
//Binary inclusive OR
x |= 8;//x is 12
Como podemos ver aqui, a sintaxe para usar esses operadores é consistente.
*4. Avaliação de operações de atribuição de compostos *
Há duas maneiras pelas quais o Java avalia as operações compostas.
Primeiro,* quando o operando do lado esquerdo não é uma matriz, *o Java irá, na seguinte ordem:
-
Verifique se o operando é uma variável declarada
-
Salve o valor do operando esquerdo
-
Avalie o operando do lado direito
-
Execute a operação binária conforme indicado pelo operador composto
-
Converta o resultado da operação binária no tipo da variável à esquerda (conversão implícita)
-
Atribua o resultado convertido à variável esquerda
Em seguida,* quando o operando do lado esquerdo é uma matriz, * as etapas a seguir são um pouco diferentes:
-
Verifique a expressão da matriz no lado esquerdo e gere um NullPointerException ou ArrayIndexOutOfBoundsException se estiver incorreto
-
Salve o elemento da matriz no índice
-
Avalie o operando do lado direito
-
Verifique se o componente da matriz selecionado é um tipo primitivo ou de referência e continue com as mesmas etapas da primeira lista, como se o operando do lado esquerdo fosse uma variável.
Se alguma etapa da avaliação falhar, o Java não continuará executando as etapas a seguir.
*Vamos dar alguns exemplos relacionados à avaliação dessas operações para um elemento da matriz:*
int[] numbers = null;
//Trying Incrementation
numbers[2] += 5;
Como seria de esperar, isso gerará uma NullPointerException.
No entanto, se atribuirmos um valor inicial à matriz:
int[] numbers = {0, 1};
//Trying Incrementation
numbers[2] += 5;
Nos livraríamos da NullPointerException, _ mas ainda receberíamos uma _ArrayIndexOutOfBoundsException, pois o índice usado não está correto.
Se corrigirmos isso, a operação será concluída com êxito:
int[] numbers = {0, 1};
//Incrementation
numbers[1] += 5;//x is now 6
Finalmente, a variável x será 6 no final da atribuição.
*5. Fundição implícita *
Uma das razões pelas quais os operadores compostos são úteis é que eles não apenas fornecem uma maneira mais curta para as operações, mas também convertem variáveis implicitamente.
Formalmente, uma expressão de atribuição composta da forma:
E1 op = E2
é equivalente a:
_E1 - (T) (E1 op E2) _
onde T é o tipo de E1.
Vamos considerar o seguinte exemplo:
long number = 10;
int i = number;
i = i* number;//Does not compile
Vamos analisar por que a última linha não será compilada.
O Java promove automaticamente tipos de dados menores para dados maiores, quando estão juntos em uma operação, mas gera um erro ao tentar converter de tipos maiores para menores .
Portanto, primeiro, i será promovido para long e, em seguida, a multiplicação fornecerá o resultado 10L. O resultado longo será atribuído a i, que é um int, e isso gerará um erro.
Isso pode ser corrigido com uma conversão explícita:
i = (int) i *number;
Neste caso, os operadores de atribuição composta de Java são perfeitos porque fazem uma conversão implícita:
i* = number;
Essa instrução funciona perfeitamente, convertendo o resultado da multiplicação para int e atribuindo o valor à variável do lado esquerdo, i.
6. Conclusão
Neste artigo, examinamos os operadores compostos em Java, fornecendo alguns exemplos e diferentes tipos deles. Explicamos como o Java avalia essas operações.
Por fim, também analisamos a conversão implícita, uma das razões pelas quais esses operadores de taquigrafia são úteis.
Como sempre, todos os trechos de código mencionados neste artigo podem ser encontrados em nosso GitHub repository .