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