Comportamiento indefinido: tengo una situación aquí con postfijo y operador de prefijo

Tengo una situación aquí con el operador de corrección posterior y prefijo. Eche un vistazo al fragmento de código a continuación. Sé que existe cierta precedencia de operadores. pero necesito una explicación clara con respecto a esto.

<?php
    $a=0;
    echo $a++ + ++$a; //this will result 2 that is ok

    $b=0;
    echo $b++ - ++$b; //this should result 0 isn't it? but am getting -2!
 ?>

Noticias : La respuesta aceptada describe comportamiento indefinido

preguntado el 03 de mayo de 12 a las 11:05

... ¿Qué te confunde? Siguiendo la lógica de tu primera ecuación, en realidad deberías obtener -2, ¿no? -

@Arun: Eso siempre sucede si haces uso de comportamiento indefinido. Y lo que haces es un comportamiento indefinido. Así que no intentes obtener una explicación que siga una lógica determinista, ya que indefinido es lo opuesto a eso. -

@hakre echo $c=($b++) - (++$b); el resultado de esta declaración también obtiene -2. ¿Qué quisiste decir con comportamiento indefinido? -

3 Respuestas

Eso siempre sucede si haces uso de comportamiento indefinido. Y lo que haces es un comportamiento indefinido. Así que no intentes obtener una explicación que siga una lógica determinista, ya que indefinido es lo opuesto a eso.

La Estados del manual de PHP:

// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5

Usted extendió su pregunta en un comentario:

echo $c=($b++) - (++$b); el resultado de esta declaración también obtiene -2. ¿Qué quisiste decir con comportamiento indefinido?

$b = 0 and it shall:

$c=($b++) - (++$b);   | $b is 0  - process first brackets
$c= 0 - (++$b);       | $b is 1  - process second bracktes inner operator
$c= 0 - ($b);         | $b is 2  - process second brackets 
$c= 0 - 2;            | calculate
$c= -2;

Obviamente, así es como resulta para su código cuando lo ejecuta. No está definido que siempre se calculará de esa manera, por lo tanto, no está definido. Por ejemplo, si el segundo paréntesis se procesa primero, obtendrá un resultado diferente.

contestado el 03 de mayo de 12 a las 11:05

echo $c=($b++) - (++$b); ¿Esto también está bajo un comportamiento indefinido? - Arun

@Arun: Sí, lo es. Imagine que el segundo paréntesis se ejecuta primero. - hakré

@ARun: No eres el único: ¿Por qué $ a + ++ $ a == 2? - hakré

Debido a el Operadores de incremento/decremento (doc. PHP)

<?php
    $a=0;
    echo $a++ + ++$a; // 0 + 2 = 2

    $b=0;
    echo $b++ - ++$b; // 0 - 2 = -2
 ?>

$a++ devoluciones 0 e incrementos $a por 1 ($a == 1); ++$a incrementos $a por 1 ($a == 2) y devoluciones 2

contestado el 03 de mayo de 12 a las 11:05

Los resultados están perfectamente bien:

$a++ imprime el valor y lo incrementa inmediatamente ++$a incrementa antes de la salida

así que en el primer caso esto sería como:

  1. $a=0
  2. salida 0
  3. incrementar $a en 1: $a=1
  4. incrementar de nuevo (antes de la salida): $a=2
  5. salida 2

0 + 2 = 2

en el segundo caso:

  1. $b=0
  2. salida 0
  3. incrementar $b en 1: $b=1
  4. incrementar de nuevo (antes de la salida): $b=2
  5. salida 2

0 - 2 = -2

Simplemente hace lo que dice.

Saludos,

STEFAN

contestado el 03 de mayo de 12 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.