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 operatorx *= z; // Compound assignment operatorO 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 COMPILECom 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 3System.out.println(y); // Also, outputs 3A 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.