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);
}
}
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.
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);