2017-10-21 101 views
2

En PHP, pourquoi false and (true && print('hi')) évalue à false et n'imprime pas 'hi'? Je sais que les opérateurs logiques évaluent en court-circuit (ils sont paresseux), mais && et parenthèse a upper precedence que and, donc (true && print('hi')) devrait être évalué en premier.false et (true && print ('hi'))

Des indices? Merci!

+0

@CBroe pas la même chose.il demande de ne pas travailler avec "vrai" en considérant la priorité de l'opérateur. – tan

+2

@tan oui c'est. La question _ "fait la condition après && (ou' et', comme ici) est toujours évaluée "_ obtient une réponse avec Non pour" faux et quelque chose "- le' quelque chose 'ne reçoit même pas plus que nécessaire. La précédence de l'opérateur signifie l'influence de l'opérateur sur le résultat de l'expression, pas nécessairement l'ordre d'évaluation des sous-expressions individuelles. – CBroe

+2

Je ne sais pas pourquoi ces questions hypothétiques se posent, si j'ai écrit ce code tout en travaillant pour une entreprise que je m'attendais à être expulsé, pas voté sur SO. –

Répondre

0

C'est en fait un bon exemple de test à utiliser pour montrer l'ordre d'évaluation.

L'évaluation est effectuée de gauche à droite.

Donc, pour ajouter quelque chose à votre exemple ...

<?php 

// Evaluates Left to right 
// Prints HI as (true && print('Hi') evaluates as TRUE 
// Then the && FALSE is tested and it fails 
if((true && print('Hi')) && FALSE){ 
    echo 'Success'; 
} else { 
    echo 'Failed'; 
} 

// Evaluates Left to right 
// FALSE is evaluated and Fails 
// No further checking is performed 
if(FALSE && (true && print('Hi'))){ 
    echo 'Success'; 
} else { 
    echo 'Failed'; 
} 

Note: Je ne l'ai pas mis dans le ET vs & & mais vous obtenez les mêmes résultats.

0

je peux voir ce qui suit dans http://php.net/manual/en/language.operators.precedence.php:

priorité et associativité des opérateurs ne déterminent comment les expressions sont regroupés, ils ne précisent pas un ordre d'évaluation. PHP ne spécifie pas (dans le cas général) dans quel ordre une expression est évaluée et le code qui suppose un ordre spécifique d'évaluation doit être évité, car le comportement peut changer entre les versions de PHP ou selon le code environnant.

Alors, je l'ai testé les éléments suivants:

print('one') and (1 + print('two')) 

et il imprime:

onetwo 

, PHP évalue premier opérande gauche du and même + a une priorité plus élevée et même en utilisant des parenthèses . Intéressant!

Merci à tous.