Ajuda com operadores java

Eae pessoal, blz? Estou estudando a linguagem Java e no site http://fresh2refresh.com/java-questions/ onde encontrei alguns exercícios sobre a linguagem, me deparei com um que não consigo entender por qual motivo o resultado final é “1”.
Ou seja, o valor da variável “i” no final é 1. Mas como isso é possível, se no código a variável é incrementada uma vez (i++) e depois ela sofre mais uma alteração (i+=2).

Espero que tenham entendido e se alguém puder me explicar eu ficarei grato.


public class ShortCkt {
public static void main(String args[]) {
int i = 0;
boolean t = true;
boolean f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
}
}

b = (f && ((i+=2) > 0));

Essa operação i+=2 não é executada, porque o operador && funciona como short-circuit. Quando ele detecta que f é FALSE, nem checa o outro membro do AND, porque essa expressão já vai ser falsa independentemente do que há em seguida. Por isso o valor final de i é 1.

Isso está errado. i++ é um syntax sugar para i = i + 1, é exatamente a mesma coisa. O bytecode gerado é o mesmo. A expressão i++ involve 3 operações: checar o valor de i, somar com 1 e reatribuir esse novo valor a i.

O mesmo vale para isso, também está errado. Incrementar, no caso desses operadores ++ e --, é atribuir o valor atual + ou - 1.

Eu fui checar no netbeans isso, pois parei pra pensar melhor, você está certo.
De inicio a primeira coisa q me veio na cabeça é que eu não poderia fazer ii = i = i+2; por isso cheguei àquela conclusão.

hehe, desculpe meu erro. ^^’

Não respondi te criticando. Não precisa se desculpar, todo mundo erra hehe. O importante é aprender com isso :slight_smile:

1 curtida

Fiz umas alterações pra tentar explicar melhor:

1.         int i = 0;
2.         boolean t = true;
3.         boolean f = false;
4.         boolean b = false;
5. System.out.println("Passo 1: "+i+"-"+b);
6.         //i++;
7.         b = (t && ((i++) == 0)); // i==0 "O incremento acontece depois e não na comparação e só acontece pq o resultado é verdadeiro
8. System.out.println("Passo 2: "+i+"-"+b);
9.         b = (f && ((i+=2) > 0)); // i==1 " O incremento não acontece pq o resultado de " f " é false e não chega a verificar o AND
10.         //b = (!f && ((i+=2) > 0)); // i==1 "O incremento acontece pq passa a verifica o "AND" && já que o resultado de "!f" é verdadeiro
11.         System.out.println("Passo 3: "+i+"-"+b);
  • Executa pra ver o resultado.
  • Retire os comentários e execute novamente

Obrigado, executei o código e agora ficou mais claro o entendimento.

1 curtida

Valew pessoal, mais um conhecimento adquirido. :slight_smile: