-
Alguém tem uma explicação pra esse gabarito estar como Certo?
-
No manual do php tem uma explicacao um pouco mais logica
================================================================================================
A expressão (expr1) ? (expr2) : (expr3) é avaliada para expr2 se expr1 é avaliada como TRUE
, ou expr3 se expr1 é avaliada como FALSE
.
Nota: Note que o operador ternário é um comando, e ele não é avaliado para uma variável, mas para o resultado do comando. Isto é importante saber se você quer retornar uma variável por referência. O comando return $var == 42 ? $a : $b; em uma função que retorna por referência conseqüêntemente não irá funcionar e será avisado nas últimas versões do PHP.
Nota:
É recomendado para evitar "stacking" de expressões ternárias. O comportamento do PHP quando usando mais de um operador ternário no único comando não é óbvio:
Exemplo : Não-óbvio comportamento do ternário
<?php
// o seguinte aparenta imprimir 'true'
echo (true?'true':false?'t':'f');
// conteudo, a saída acima é 't'
// isto por causa da expressão ternário se avaliada da esquerda pra direita
// o seguinte é a versão mais óbvia do mesmo código acima
echo ((true ? 'true' : 'false') ? 't' : 'f');
// aqui, você pode ver que a primeira expressão é avaliada para 'true', que
// por sua vez avalia para (bool)true, assim retornando a parte true da
// segunda expressão ternária.
?>
http://php.net/manual/pt_BR/language.operators.comparison.php
-
O correto não seria a impressão de "A verdadeiro", visto que $A é true?
-
Pessoal, essa questão cobrava se você sabia a precedência dos operadores.
De acordo o manual do PHP http://br2.php.net/manual/pt_BR/language.operators.precedence.php,
o "?" a precedência é a esquerda, isso significa que a expressão a esquerda será avaliada primeiro. Na questão temos duas expressões:
1- ($A) ? "A verdadeiro": ($B), no qual o resultado vai ser: "A verdadeiro", pois $A = true
A segunda expressão:
2- "A verdadeiro" ? "B verdadeiro" : "falso"; Como uma string não vazia é avaliada como true, então o resultado da segunda expressão será "B verdadeiro".
O operador ? indica que a expressão a esquerda deve ser avaliada primeiro, por isso que a expressão 1 deve ser avaliada primeiro e em seguida a expressão 2. Seria melhor visualizado se tivesse assim:
echo ( ($A) ? "A verdadeiro" : ($B) ) ? "B verdadeiro" : "falso";
-
Temos que ver a questão do binário, toda string vem valor binário igual maior que 1. Então " A verdadeiro" tem um valor em binário maior igual a 1 então 1 é verdadeiro em binário e zero falso. Por isso que a a resposta está certa. Caso tenha confusão basta transformar o ternário em if convencional e realizar os testes. Lembrando que vazio ou null é falso.
if("") - retorna falso
-
Muito bom comentário Rodrigo Botelho. É isso mesmo. Difícil a leitura da forma que foi colocada a expressão na questão mas o teu comentário elucidou tudo!!!
Obrigado
-
O Erro da questão encontra-se no link:
http://php.net/manual/pt_BR/language.operators.comparison.php
Nota:
É recomendado para evitar "stacking" de expressões ternárias. O comportamento do PHP quando usando mais de um operador ternário no único comando não é óbvio:
Em várias outras linguagens de programação (java, python, C, etc.) o comportamento dessa expressão ternária retorna "A Verdadeiro", porém infelizmente em PHP o resultado é "B Verdadeiro". Questão passível anulação.Exemplo #3 Não-óbvio comportamento do ternário
<?php// o seguinte aparenta imprimir 'true'echo (true?'true':false?'t':'f');// conteudo, a saída acima é 't'
// isto por causa da expressão ternário se avaliada da esquerda pra direita
// o seguinte é a versão mais óbvia do mesmo código acimaecho ((true ? 'true' : 'false') ? 't' : 'f');
// aqui, você pode ver que a primeira expressão é avaliada para 'true', que
// por sua vez avalia para (bool)true, assim retornando a parte true da
// segunda expressão ternária.
-
Quem também está estudando Java pode ter errado esta questão, pois há uma diferença na avaliação da expressão ternária em relação ao PHP. O resultado da expressão equivalente "System.out.println((A) ? "A verdadeiro" : (B) ? "B verdadeiro" : "falso");" seria: "A verdadeiro"
Em java: (A) ? "A verdadeiro" : (B) ? "B verdadeiro" : "falso" ==>
if (A) {
return "A verdadeiro";
} else if (B) {
return "B verdadeiro";
} else {
return "falso";
}
Em PHP ==>
if ($A) {
if ("A verdadeiro") {
return "B verdadeiro";
} else {
return "falso";
}
} else if ($B) {
return "B verdadeiro"; } else {
return "falso";
}
-
php tem bugs standard
-
sério, não sei como as pessoas não desistem de PHP
-
alguém se atentou que este código não funciona, né?!
que esta questão deveria ter sido anulada se recurso bem feito tivesse sido aparesentado.