olá amigos, por favor, estou comecando agora na linguagem java, estou com um codigo, um exemplo que peguei, mas não consigo entender a logica da solução do problema,
vcs poderiam, se possivél, me explicar o porque mostra este resultado.
ex:
class Ternario {
public static void main (String[] args ) {
boolean c = false;
String valor = (c= !c) ? (c= !c)? “verdadeiro”:“falso” : (c= !c)?“verdadeiro 2”:“falso 2”;
System.out.println (valor);
boolean d = true;
String valor2 = (d= !d) ? (d= !d)? "verdadeiro":"falso" : (d= !d)?"verdadeiro 2":"falso 2";
System.out.println (valor2);
}
}
na primeira boolean c , ele imprime falso, na segunda boolean d, ele imprime verdadeiro 2. vejo que ele nega o c nesta parte (c= !c) ? , mas se ele nega, porque é falso ?
ja na boolean 2, deixando ele d= true, ele imprime verdadeiro 2. não entendi mais ainda ! obrigado a todos.
- Vá no seu tópico;
- Use a opção editar;
- Siga essas dicas: http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor
Analise parte por parte, no primeiro caso (veja com parênteses):
String valor = (c= !c) ?
((c= !c) ? "verdadeiro":"falso") :
((c= !c) ? "verdadeiro 2":"falso 2");
Ele começa avaliando aqui (veja com parêntereses):
String valor = (c= !c) ? (c= !c)? “verdadeiro”:“falso” : (c= !c)?“verdadeiro 2”:“falso 2”;
Que transforma c em true, e retorna true. Depois, ele vai para o lado verdadeiro da expressão:
String valor = (c= !c) ? (c= !c) ? “verdadeiro”:“falso” : (c= !c)?“verdadeiro 2”:“falso 2”;
Que transforma c em false, e retorna false, indo para o lado falso da expressão:
String valor = (c= !c) ? (c= !c) ? “verdadeiro”:“falso” : (c= !c)?“verdadeiro 2”:“falso 2”;
No segundo caso, d é alterado para falso, o que move para o lado falso da expressão:
String valor2 = (d= !d) ? (d= !d)? “verdadeiro”:“falso” : (d= !d)?“verdadeiro 2”:“falso 2”;
Então é alterado para verdadeiro. O que nos leva ao passo final:
String valor2 = (d= !d) ? (d= !d)? “verdadeiro”:“falso” : (d= !d)?“verdadeiro 2”:“falso 2”;
Mas claro, isso é código para lá de porco. Primeiro, pq não se usa atribuições na primeira parte do ternário, e sim, comparações. Atribuir ali é tão má prática quanto atribuir num if. Segundo, porque você não deve encadear muitos operadores ternários pois, como dá para constatar nesse exemplo, acaba com a legibilidade.
O ponto que você deve levar em consideração é que (c= !c) é uma atribuição e não uma comparação.
Dessa forma, se a variável c é false, ao entrar no comando acima ficaria c = !false, como o operador ! inverte para true, c fica como true
E assim a parte verdadeira da expressão é executada…
O mesmo acontece com a variável d, só que de forma oposta.
Ela começa como true é invertida para false, é executada a parte false do primeiro operador ternário.
Depois de false a variável d é invertida para true e a parte verdadeira do segundo operador ternário é executado.
Abraço…
ok amigos, obrigado pela resposta, deu para compreender com clareza a soluçao.
obrigado novamente a r.Jovelli e ViniGodoy