Operador ternario[Resolvido]

Olá a todos,

Em sim simulado existe o seguinte código:

[code]

public static void main(String[] args) {
boolean c = false;

	String str = (c= !c) ? (c =!c) ? "Hello" : "hello" :(c=!c) ? "world" : "World";
	
	System.out.println(str);
}

}[/code]

a sáida é :

hello

Fiquei um bom tempo olhando isto e não consegui entender o resultado. Alguém poderia me explicar??

Obrigado a todos.

Vamos lá,
O operador ternário funciona da seguinte forma:

Até aqui tudo bem.

Nessa expressão, que você está passando, tem uma “pegadinha”. Atribuição.
Em java uma condição booleana é qualquer expressão que retorne true ou false.

A variável c inicia com o valor falso.

A primeira “comparação” na verdade é uma atribuição (c= !c), note que não tem == e sim somente =, traduzindo: c = !false (negação de falso), que resulta em c = true.
Ao fazer c = !false (true) a variável c recebe o valor verdadeiro e retorna o valor para o IF, então ele vai para o segundo (c =!c) que fica c = !true, que resulta em c = false, a variável c recebe o valor falso e retorna para o IF, na segunda parte o false faz com que str receba o valor hello.

Resumindo:
Aqui temos uma atribuição (somente um =) e toda a atribuição o valor é retornado, nesse caso não dá erro pois a variável é do tipo booleano, se fosse de outro tipo resultaria em erro.

[code]if (c = !c) {

}[/code]

Note que o correto para comparação seria (==):

[code]if (c == !c) {

}
[/code]

Se não fui claro, poste que tento melhorar …rsrsr

Além do que o AlvaroJunior explicou a questão mostra operadores ternários aninhados, logo no primeiro caso a variável c recebe true, depois entra no primeiro if e recebe false , Se fosse true imprimiria Hello , como é false imprime hello, se o primeiro caso for false então ele entra no segundo if aninhado (segundo operador ternário) e imprimiria world.

Olá obrigado por responderem :smiley:

Colocando em if/else:

if(c= !c){ if( c = !c) System.out.println("Hello"); else System.out.println("hello"); else if (c = !c){ System.out.println("world"); else System.out.println("World"); }

Ficaria assim mesmo?

Exatamente. Agora uma outra questão que vi num test de certificação, é tem um limite para operadores ternários são 6 aninhados , assim como o if-else tmb tem um limite . Mas neste último caso não sei qual é o limite.

Que raio de teste é esse que disse que há um limite de aninhamento para o operador condicional (indevidamente chamado de “operador ternário” - então se eu disser “operador binário” tenho de supor que é o operador de adição, por exemplo?) Isso é lenda urbana, e não cai em exames de certificação.

Os limites que existem estão descritos em http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.11 , e não precisam ser decorados.

Blz finalmente entendi muito obrigado a todos.