Comportamiento indefinido: tengo una situación aquí con postfijo y operador de prefijo
Frecuentes
Visto 407 veces
0
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
3 Respuestas
3
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.
// 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é
2
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
2
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:
- $a=0
- salida 0
- incrementar $a en 1: $a=1
- incrementar de nuevo (antes de la salida): $a=2
- salida 2
0 + 2 = 2
en el segundo caso:
- $b=0
- salida 0
- incrementar $b en 1: $b=1
- incrementar de nuevo (antes de la salida): $b=2
- 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 php or haz tu propia pregunta.
... ¿Qué te confunde? Siguiendo la lógica de tu primera ecuación, en realidad deberías obtener -2, ¿no? - Andreas Wong
@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
@hakre echo $c=($b++) - (++$b); el resultado de esta declaración también obtiene -2. ¿Qué quisiste decir con comportamiento indefinido? - arun