44 votes

PHP calcul - pourquoi 1+1=3?

Le code de mon ami m'envoie est:

echo '1+1='.(1+1==2?2:1+2==2?3:2);

Pourquoi est-il 3?

85voto

p.s.w.g Points 81433

PHP de l'évaluation de la ternaire (ou conditionnelle) de l'opérateur est un peu différente de celle des autres langues.

1+1==2 ? 2 : 1+2==2 ? 3 : 2

La plupart des langages (JavaScript par exemple) permettrait d'évaluer ce que:

(1+1==2) ? (2) : ( (1+2==2) ? (3) : (2) ) 
=> 2

PHP, cependant, les évalue comme suit:

( (1+1==2) ? (2) : (1+2==2) ) ? (3) : (2)
=> 3

Parce (1+1==2) a la valeur true, le résultat de la première ternaire expression 2, et le résultat est ensuite transmis à la deuxième ternaire expression, qui renvoie 3.

Ce comportement est fait allusion dans la documentation:

Il est recommandé d'éviter de "empilement" ternaire expressions. PHP comportement lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction est pas évident...

L'article de Wikipédia sur l' ?: opérateur mentionne également:

En raison d'une malheureuse erreur dans la langue de la grammaire, de la mise en œuvre de ?: en PHP utilise la mauvaise associativité des opérateurs par rapport à d'autres langues...

La raison en est que l'imbrication de deux opérateurs conditionnels produit un grand état avec les deux dernières options comme ses branches: c1 ? o1 : c2 ? o2 : o3 est vraiment ((c1 ? o1 : c2) ? o2 : o3). Ceci est reconnu et ne changera probablement pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X