Operadores de Atribuição Composta
Além do operador de atribuição simples, =, existem também vários operadores de atribuição compostos. Apenas dois dos operadores compostos listados na Tabela 2.1 são necessários para o exame, += e -=. Os operadores complexos são apenas formas glorificadas do operador de atribuição simples, com uma operação lógica ou aritmética incorporada que aplica os lados esquerdo e direito da instrução e armazena o valor resultante em uma variável no lado esquerdo da declaração. Por exemplo, as duas instruções a seguir após a declaração de x e z são equivalentes:
int x = 2, z = 3;
x = x * z; // Simple assignment operator
x *= z; // Compound assignment operator
O lado esquerdo do operador composto só pode ser aplicado a uma variável já definida e não pode ser usada para declarar uma nova variável. No exemplo anterior, se x ainda não estivesse definido, a expressão x * = z não seria compilada.
Os operadores compostos são úteis para mais do que apenas uma forma abreviada - eles também podem nos poupar de ter que converter explicitamente um valor. Por exemplo, considere o seguinte exemplo, no qual a última linha não será compilada devido ao resultado ser promovido a um long e atribuído a uma variável int:
long x = 10;
int y = 5;
y = y * x; // DOES NOT COMPILE
Com base nas duas últimas seções, você deve conseguir identificar o problema na última linha. Essa última linha pode ser corrigida com uma conversão explícita para (int), mas há uma maneira melhor de usar o operador de atribuição composta:
long x = 10;
int y = 5;
y *= x;
O operador composto primeiro converterá x em um long, aplicará a multiplicação de dois valores long e, em seguida, converterá o resultado para int. Ao contrário do exemplo anterior, no qual o compilador emitiu uma exceção, neste exemplo, vemos que o compilador converterá automaticamente o valor resultante para o tipo de dados do valor do lado esquerdo do operador composto.
Uma última coisa a saber sobre o operador de atribuição é que o resultado da atribuição é uma expressão do próprio valor, igual ao valor da atribuição. Por exemplo, o seguinte trecho de código é perfeitamente válido, se não um pouco estranho:
long x = 5;
long y = (x=3);
System.out.println(x); // Outputs 3
System.out.println(y); // Also, outputs 3
A chave aqui é que (x = 3) faz duas coisas. Primeiro, ele define o valor da variável x para 3. Em segundo lugar, ele retorna um valor da atribuição, que também é 3. Os criadores do exame gostam de inserir o operador de atribuição = no meio de uma expressão e usar o valor da atribuição como parte de uma expressão mais complexa.