SóProvas


ID
1042621
Banca
CESPE / CEBRASPE
Órgão
MPU
Ano
2013
Provas
Disciplina
Programação
Assuntos

Julgue os seguintes itens, a respeito das linguagens de programação PHP e Ajax.

O resultado apresentado pelo código PHP abaixo, ao ser executado, será B verdadeiro.

$A=true;
$B=false;
echo ($A)?"A verdadeiro":($B)?"B verdadeiro":"falso"; ?>

Alternativas
Comentários
  • 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.