Trabalhando com operadores unários
Por definição, um operador unário é aquele que requer exatamente um operando, ou variável, para funcionar. Conforme mostrado na Tabela 2.2, eles geralmente executam uma tarefas simples, como aumentar uma variável numérica em um ou negar um valor booleano.
Complementos lógicos e operadores de negação
O operador de complemento lógico, !, Inverte o valor de uma expressão booleana. Por exemplo, se o valor for true, ele será convertido em falso e vice-versa. Para ilustrar isso, compare as saídas das seguintes declarações:
boolean x = false;
System.out.println(x); // false
x = !x;
System.out.println(x); // true
Da mesma forma, o operador de negação, -, inverte o sinal de uma expressão numérica, conforme mostrado nestas instruções:
double x = 1.21;
System.out.println(x); // 1.21
x = -x;
System.out.println(x); // -1.21
x = -x;
System.out.println(x); // 1.21
Com base na descrição, pode ser óbvio que alguns operadores exigem que a variável ou a expressão em que estão agindo sejam de um tipo específico. Por exemplo, você não pode aplicar um operador de negação, -, a uma expressão booleana, nem pode aplicar um operador de complemento lógico, !, A uma expressão numérica. Desconfie de perguntas sobre o exame que tentam fazer isso, pois elas não compilarão o código. Por exemplo, nenhuma das linhas de código a seguir compilará:
int x = !5; // DOES NOT COMPILE
boolean y = -true; // DOES NOT COMPILE
boolean z = !0; // DOES NOT COMPILE
A primeira instrução não será compilada devido ao fato de que em Java você não pode executar uma inversão lógica de um valor numérico. A segunda instrução não compila porque você não pode numericamente negar um valor booleano; você precisa usar o operador de inversão lógica (!).
Finalmente, a última instrução não compila porque você não pode pegar o complemento lógico de um valor numérico, nem pode atribuir um inteiro a uma variável booleana.
Fique de olho nas perguntas do exame que usam o operador do complemento lógico ou valores numéricos com expressões ou variáveis booleanas. Ao contrário de algumas outras linguagens de programação, Java 1 e true não estão relacionadas de qualquer forma, assim como 0 e false também não estão relacionados.
Operadores de Incremento e Decremento
Operadores de incremento e decremento, ++ e --, respectivamente, podem ser aplicados a operandos numéricos e têm ordem ou precedência maior, em comparação com operadores binários. Em outras palavras, eles geralmente são aplicados primeiro a uma expressão.
Operadores de incremento e decremento requerem um cuidado especial porque a ordem em que são aplicados ao operando associado pode fazer diferença na maneira como uma expressão é processada. Se o operador for colocado antes do operando, chamado de operador pré-incremento e operador pré-decremento, o operador será aplicado primeiro e o valor retornado será o novo valor da expressão. Como alternativa, se o operador for colocado depois do operando, chamado de operador pós-incremento e operador pós-decremento, o valor original da expressão será retornado, com o operador aplicado após o valor ser retornado.
O trecho de código a seguir ilustra essa distinção:
int counter = 0;
System.out.println(counter); // Outputs 0
System.out.println(++counter); // Outputs 1
System.out.println(counter); // Outputs 1
System.out.println(counter--); // Outputs 1
System.out.println(counter); // Outputs 0
O primeiro operador de pré-incremento atualiza o valor para counter e gera o novo valor de 1. O próximo operador pós-decremento também atualiza o valor de counter, mas emite o valor antes que o decremento ocorra.
Uma prática comum em um exame de certificação, embora menos comum no mundo real, é aplicar vários operadores de incremento ou decremento a uma única variável na mesma linha:
int x = 3;
int y = ++x * 5 / x-- + --x;
System.out.println("x is " + x);
System.out.println("y is " + y);
Este é mais complicado que o exemplo anterior porque x é modificado três vezes na mesma linha. Cada vez que é modificado, conforme a expressão se move da esquerda para a direita, o valor de x muda, com diferentes valores sendo atribuídos à variável. Como você se lembra da nossa discussão sobre a precedência do operador, a ordem de operação desempenha um papel importante na avaliação deste exemplo.
Então, como você lê esse código? Primeiro, o x é incrementado e retornado à expressão, que é multiplicada por 5. Podemos simplificar isso:
int y = 4 * 5 / x-- + --x; // x assigned value of 4
Em seguida, x é decrementado, mas o valor original de 4 é usado na expressão, levando a isso:
int y = 4 * 5 / 4 + --x; // x assigned value of 4
A atribuição final de x reduz o valor para 2 e, como esse é um operador de pré-incremento, esse valor é retornado para a expressão:
int y = 4 * 5 / 4 + 2; // x assigned value of 2
Finalmente, avaliamos o múltiplo e a divisão da esquerda para a direita e terminamos com a adição. O resultado é então impresso:
x is 2
y is 7