1. Operações booleanas

Os operadores |e &podem ser aplicados não apenas a números, mas também a expressões booleanas.

Mas, como você já sabe, existem &&e ||operadoras. Por que usaríamos |em vez de ||e &em vez de &&? Existe algum ponto para isso? Parece que existe. Às vezes.

Os operadores lógicos ||e &&são executados da esquerda para a direita seguindo o chamado princípio preguiçoso .

(expression1) || (expression2) || (expression3)

Se expression1 for igual a true, não adianta avaliar expression2 e expression3: o resultado será trueindiferente.

Assim, ao avaliar expressões (elas são avaliadas da esquerda para a direita), assim que obtemos true, a avaliação do restante das expressões é ignorada . E se expression2 e expression3incluir chamadas de método, esses métodos não serão chamados !

O mesmo vale para o &&operador lógico:

(expression1) && (expression2) && (expression3)

Se expression1for igual a false, não adianta avaliar expression2e expression3: o resultado será falseindiferente.

Este é um fato importante que permite escrever coisas como:

String s = null;
if (s != null && s.length() > 0) {

O exemplo acima nunca vai te dar um NullPointerException , pois s.length()só será executado se a primeira parte s! = nullfor true.

Se sfor igual a null, a parte à esquerda do &&operador é false, então o resultado de toda a expressão booleana é false, portanto a parte à direita ( s.length() > 0) não é avaliada.

Tudo isso para dizer:

Se você usar o |operador ou o &operador, não haverá avaliação preguiçosa : cada subexpressão sempre será avaliada.



2. Precedência de operação em Java

Como você provavelmente se lembra de sua aula de matemática do ensino médio, o operador de multiplicação tem maior precedência do que o operador de adição. Os parênteses têm uma precedência ainda maior: as expressões entre parênteses são avaliadas primeiro, depois a multiplicação e a divisão e, por fim, a adição e a subtração.

Os operadores em Java também têm uma ordem de precedência. A diferença é que a) há um pouco mais deles, b) para alguns operadores, os operandos são avaliados da esquerda para a direita, enquanto para outros - da direita para a esquerda.

Aqui está uma tabela com todos os operadores Java:

Categoria Operador Associativo
Posfixo () [] . Da esquerda para a direita
unário ++ -- ! ~ Direita para esquerda
multiplicativo * / % Da esquerda para a direita
Aditivo + - Da esquerda para a direita
Mudança >> >>> << Da esquerda para a direita
relacional > >= < <= Da esquerda para a direita
Igualdade == != Da esquerda para a direita
bit a bitAND & Da esquerda para a direita
Exclusive OR(XOR) ^ Da esquerda para a direita
bit a bitOR | Da esquerda para a direita
LógicoAND && Da esquerda para a direita
LógicoOR || Da esquerda para a direita
Condicional ?: Direita para esquerda
Atribuição = += -= *= /= %= >>= <<= &= ^= |= Direita para esquerda
Vírgula , Da esquerda para a direita

A linha superior contém os operadores com a precedência mais alta. Os parênteses ()são usados ​​para definir explicitamente a prioridade. Os colchetes []são usados ​​para acessar um elemento em um índice específico de uma variável de matriz. O operador ponto ( .) é usado para acessar campos e métodos usando uma referência a um objeto ou classe.

Quanto mais baixo os operadores estiverem na tabela, menor será sua precedência.

Se você usar vários operadores em uma expressão, não seja preguiçoso: adicione parênteses.

Em Java, você pode escrever algo como if (a & 1<< b > ~c), mas não deveria. Você está escrevendo código não apenas para o compilador, mas também para outros programadores. Quanto mais legível for o código, melhor.



3. Incremento de prefixo e pós-fixo

Como você já sabe, Java possui um operador de incremento ( ++) e um operador de decremento ( --). Respectivamente, eles aumentam e diminuem o valor de uma variável em 1.

O que você provavelmente não sabe é que existem dois tipos desses operadores: prefix (o operador é colocado antes da variável) e postfix (o operador é colocado após a variável). E dois tipos de operadores funcionam de maneira um pouco diferente.

Em Java, você pode escrever uma expressão como esta:

int a = 5;
int b = a++;

Se o ++operador aparecer depois de uma variável e a variável fizer parte de alguma expressão (como no exemplo acima), então a expressão usará o valor atual da variável e somente depois a variável será aumentada em 1.

Em outras palavras, algo assim acontecerá:

int a = 5;
int b = a;
a = a + 1;

Ou seja , não bserá como você pode pensar à primeira vista.56

Se o ++operador estiver antes da variável e a variável fizer parte de alguma expressão, primeiro ela será incrementada 1e só depois seu valor será utilizado na expressão.

int a = 5;
int b = ++a;

O exemplo acima é equivalente ao exemplo a seguir:

int a = 5;
a = a + 1;
int b = a;

Aqui, bserá igual a 6.

Existe até um exemplo usado por programadores Java para determinar se outra pessoa também é um programador Java:

int a = 5;
int b = ++a++a;

Sim, você pode escrever isso também.

Este exemplo irá compilar perfeitamente e se transformar em algo assim:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

Para o --operador, tudo é exatamente igual.