Duvida operador Ternário

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.

  1. Vá no seu tópico;
  2. Use a opção editar;
  3. 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