Le code de mon ami m'envoie est:
echo '1+1='.(1+1==2?2:1+2==2?3:2);
Pourquoi est-il 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?
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 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.