Operador ternario[Resolvido]

6 respostas
C

Olá a todos,

Em sim simulado existe o seguinte código:

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

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

6 Respostas

A

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

(<condição booleana>) ? <instruções caso seja verdadeiro> : <instruções caso seja falso falso>;

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.
if (c = !c) {

}
Note que o correto para comparação seria (==):
if (c == !c) {

}

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

A

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.

C

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?

A

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.

E

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.

C

Blz finalmente entendi muito obrigado a todos.

Criado 21 de fevereiro de 2013
Ultima resposta 22 de fev. de 2013
Respostas 6
Participantes 4