46 votes

Évaluation de l'expression non intuitive avec incrémentation

Pour le code suivant

 <?php

$a=1;   $b=$a++;              var_dump($b);
$a=1;   $b=$a+$a++;           var_dump($b);
$a=1;   $b=$a+$a+$a++;        var_dump($b);
$a=1;   $b=$a+$a+$a+$a++;     var_dump($b);
$a=1;   $b=$a+$a+$a+$a+$a++;  var_dump($b);
 

J'ai obtenu ce résultat:

 int(1)
int(3)
int(3)
int(4)
int(5)
 

Je m'attendais à 1,2,3,4,5 au lieu de 1,3,3,4,5. Pourquoi après $a=1; $b=$a+$a++; nous obtenons $b=3 ?

PHP 7.1.5-1 + deb.sury.org ~ xenial + 1 (cli) (construit le 11 mai 2017 14:07:52) (NTS)

30voto

axiac Points 13906
$a=1;   $b=$a+$a++;           var_dump($b);            // int(3)

Vous supposer que l'expression ci-dessus est évaluée de gauche à droite comme suit (les variables temporaires $u et $v sont introduits dans l'explication, pour plus de clarté):

 $a = 1;
 $u = $a;              //    ($a)   the LHS operand of `+`
 $v = $a;              //  \ ($a++) the RHS operand of `+`
 $a ++;                //  /
 $b = $u + $v;         // 2 (1+1)

Mais il n'y a aucune garantie que les sous-expressions sont évaluées dans l'ordre indiqué. La page de documentation du PHP opérateurs états (l'emphase est mienne):

Priorité et associativité des opérateurs seulement de déterminer comment les expressions sont groupés, ils ne spécifiez pas un ordre d'évaluation. PHP n'est pas (dans le cas général) spécifier l'ordre dans lequel l'expression est évaluée et le code qui suppose un ordre spécifique de l'évaluation devrait être évitée, car le comportement peut changer entre les versions de PHP ou selon le code environnant.

Par chance les valeurs calculées par PHP pour les autres expressions correspondent aux valeurs de supposer. Leurs valeurs peuvent être différentes lorsque le code est exécuté en utilisant une autre version de PHP.

23voto

deceze Points 200115

PHP n'est pas (dans le cas général) spécifier l'ordre dans lequel une expression est évaluée et le code qui suppose un ordre spécifique de l'évaluation devrait être évitée [..]

http://php.net/manual/en/language.operators.precedence.php

La raison pour laquelle vous obtenez des résultats différents, c'est que parfois le droit et parfois l'opérande de gauche sont évaluées en premier. PHP ne fait aucune garantie quant à l'ordre des opérations, donc il n'y a pas de bonne réponse et il tombe carrément dans la catégorie de comportement indéfini.

10voto

Salketer Points 2642

Selon le manuel PHP

Priorité et associativité des opérateurs seulement de déterminer comment les expressions sont regroupés, ils ne spécifiez pas un ordre d'évaluation. PHP n'est pas (dans le cas général) spécifier l'ordre dans lequel l'expression est évalué et le code qui suppose un ordre spécifique de l'évaluation devrait être évitée, car le comportement peut changer entre les versions de PHP ou selon le code environnant.

<?php
$a = 1;
echo $a + $a++; // may print either 2 or 3

$i = 1;
$array[$i] = $i++; // may set either index 1 or 2
?>

La chose étrange est que je serais attendu à ce que l'autre des lignes comme celles - $b=$a+$a+$a++; suivent le même schéma, mais il ne semble 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