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.
lvbarbosa
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.
LonelehKitten
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. ^^’
lvbarbosa1 like
Não respondi te criticando. Não precisa se desculpar, todo mundo erra hehe. O importante é aprender com isso
Vonquelbe_Cruz
Fiz umas alterações pra tentar explicar melhor:
1.inti=0;2.booleant=true;3.booleanf=false;4.booleanb=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 é verdadeiro8.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 AND10.//b=(!f&&((i+=2)>0));//i==1"O incremento acontece pq passa a verifica o "AND" && já que o resultado de "!f" é verdadeiro11.System.out.println("Passo 3: "+i+"-"+b);
Executa pra ver o resultado.
Retire os comentários e execute novamente
adrianomilitao1 like
Obrigado, executei o código e agora ficou mais claro o entendimento.