tag name php increment opcode

php - get tag name wordpress



EvaluaciĆ³n de expresiones no intuitivas con incremento (3)

PHP no (en el caso general) especifica en qué orden se evalúa una expresión y se debe evitar el código que asume un orden específico de evaluación [..]

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

La razón por la que obtiene resultados diferentes es que a veces se evalúa primero el operando de la derecha y el de la izquierda. PHP no ofrece garantías sobre el orden de las operaciones, por lo que no hay una respuesta correcta y esto cae directamente en la categoría de comportamiento indefinido.

Para el siguiente código

<?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);

Obtuve este resultado:

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

Esperaba 1,2,3,4,5 en lugar de 1,3,3,4,5. Por qué después de $a=1; $b=$a+$a++; $a=1; $b=$a+$a++; obtenemos $b=3 ?

PHP 7.1.5-1 + deb.sury.org ~ xenial + 1 (cli) (construido: 11 de mayo de 2017 14:07:52) (NTS)


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

Supuso que la expresión anterior se evalúa de izquierda a derecha de la siguiente manera (las variables temporales $u y $v se presentan en la explicación para mayor claridad):

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

Pero no hay garantía de que las subexpresiones se evalúen en un orden específico . La página de documentación de los operadores de PHP indica (el énfasis es mío):

La precedencia y la asociatividad del operador solo determinan cómo se agrupan las expresiones, no especifican un orden de evaluación. PHP no (en el caso general) especifica en qué orden se evalúa una expresión y se debe evitar el código que asume un orden específico de evaluación, ya que el comportamiento puede cambiar entre las versiones de PHP o dependiendo del código circundante.

Solo por casualidad, los valores calculados por PHP para las otras expresiones coinciden con los valores que asumió. Sus valores pueden ser diferentes cuando el código se ejecuta utilizando una versión diferente del intérprete de PHP.


Según el manual de PHP

La precedencia y la asociatividad del operador solo determinan cómo se agrupan las expresiones, no especifican un orden de evaluación. PHP no (en el caso general) especifica en qué orden se evalúa una expresión y se debe evitar el código que asume un orden específico de evaluación, ya que el comportamiento puede cambiar entre las versiones de PHP o dependiendo del código circundante.

<?php $a = 1; echo $a + $a++; // may print either 2 or 3 $i = 1; $array[$i] = $i++; // may set either index 1 or 2 ?>

Lo extraño es que esperaba otras líneas como $b=$a+$a+$a++; Sigue el mismo patrón, pero parece que no.