2011-06-19 24 views
5

¿En qué se diferencian? Esto es lo que estoy pensando, pero no estoy seguro ...Pre-incremento frente a incremento posterior

Si usa pre-incremento, por ejemplo en un bucle for con ++ j, entonces básicamente está diciendo: "Haga una copia de el valor de j para usar en el ciclo, luego incrementar j, luego pasar por las instrucciones en el ciclo con la copia de j ". Si está usando post-incremento en el mismo bucle j ++, básicamente está diciendo: "Haga una copia del valor de j para usar en el bucle, luego pase por las instrucciones en el bucle con la copia de j, luego incremente j. "

La razón por la que no estoy seguro es porque he creado un bucle for que multiplica el valor de j por 10 y luego emite el resultado para j = 1 a j = 12, usando post e incrementos previos. La salida legible para humanos es exactamente la misma con incrementos posteriores y previos. Estoy pensando, '¿Cómo son exactamente las salidas si no hay algún tipo de operación de copia involucrada?'

Entonces, supongo que la diferencia entre el incremento previo y posterior es realmente importante, en php, cuando uso referencias (que actúan como punteros en php) en lugar de nombres para los valores devueltos? Esto se debe a que no se hacen copias de las referencias, por lo que el pre-incremento sería: "Incrementar j, luego pasar por las declaraciones en el ciclo con el valor cambiado de j, luego incrementar j nuevamente ...", mientras que incremetation se vería así: "Use el valor de j para las instrucciones en el bucle, luego cambie el valor de j, luego pase por el bucle con el nuevo valor de j ..."

+5

Este comportamiento es independiente del idioma (o al menos, no específico de PHP), así que esto es realmente un duplicado de [¿Por qué no cambiar el pre al incremento de la publicación en la parte de iteración de un ciclo para hacer una diferencia?] (http://stackoverflow.com/questions/1918196/why-doesnt-changing-the-pre-to-the-post-increment-at-the-iteration-part-of-a -for) –

+3

Además de lo que dice la marca, esta pregunta sugiere que usted tiene un malentendido bastante fundamental sobre lo que realmente hace un bucle for ... no hay copia involucrada en absoluto: la tercera cláusula de un bucle for se ejecuta simplemente al final del cuerpo del bucle puede poner cualquier statmenet que desee allí y no se realizará ninguna copia especial – tobyodavies

+1

Y no hay referencias que no actúen como punteros. – netcoder

Respuesta

21

Pre- or post-incrementing no demora mágicamente las cosas hasta más tarde. Es simplemente una taquigrafía en línea.

enter image description here

// pre-increment 
$var = 5; 
print(++$var); // increments first, then passes value (now 6) to print() 

// post-increment 
$var = 5; 
print($var++); // passes value (still 5) to print(), then increments 

Ahora vamos a ver un bucle.

for ($i = 0; $i < 9; $i++) { 
    print($i); 
} 

La última parte de la declaración de bucle (el $i++) es simplemente la sentencia que debe ejecutarse después de cada iteración del bucle. "Pasa" el valor a ninguna parte, luego lo incrementa. $i no se usa en ninguna parte en ese momento. Más tarde, cuando se ejecuta la siguiente instrucción (print($i);), el valor de $i ya ha aumentado.

// add 1, then do nothing with $i 
for ($i = 0; $i < 9; ++$i) {} 

// do nothing with $i, then add 1 
for ($i = 0; $i < 9; $i++) {} 

Cualquiera que sea la forma en que lo hace, $i será la misma dentro del bucle.


Si le ayuda, se puede pensar en ellos como pequeñas rutinas que tipo de hacer esto:

// ++$i 
{ 
    $i = $i + 1; 
    return $i; 
} 

// $i++ 
{ 
    return $i; 
    $i = $i + 1; 
} 

Al releer su pregunta, creo que la confusión es más con la forma en la el bucle funciona de la forma en que funcionan los operadores de incremento Teniendo en cuenta que el incremento es una operación directa e integral, así es cómo funciona la tercera expresión en el ciclo.

// here's a basic loop 
for ($i = 0; $i < 9; $i++) { 
    // do loop stuff 
    print($i); 
} 

// this is exactly what happens 
for ($i = 0; $i < 9;) { 
    // do loop stuff 
    print($i); 

    $i++; 
} 

El hecho de que la última línea se pueda poner en la declaración de bucle no le otorga ningún poder especial. No hay referencias ni nada usado detrás de escena. La misma variable $i se ve tanto dentro como fuera del bucle. Cada instrucción dentro o fuera del ciclo busca directamente el valor de $i cuando sea necesario. Eso es. No es un negocio divertido.

+0

¿Básicamente es porque es para los valores de retorno en lugar de los valores recibidos? –

+0

@Fohsap Creo que entiendo su pregunta; ver mi actualización – Wiseguy

+1

Gran explicación :) –

1

Al hacer $x++, está aumentando de forma posterior ... Esto significa que el incremento solo ocurrirá después de que se haya evaluado la declaración.

Por lo tanto, dado el siguiente código:

$x = 10; $y = 0; $z = 5; 

$y = $z * $x++; 

PHP hace esto:

$x = 10; $y = 0; $z = 5; 

$y = $z * $x++; 

// Ignore Post-Increment, Evalutate 
$y = $z * $x; 
$y = 5 * 10; 

// Now Increment x - POST-INCREMENT 
$x = $x + 1; 
$x = 10 + 1; 
$x = 11; 

// Continue evaluating statement 
$y = 5 * 10; 
$y = 50; 

Al hacer ++$x, que son pre-incremento ... Esto significa que la incrementación ocurrirá antes de la declaración se evalúa:

$x = 10; $y = 0; $z = 5; 

$y = $z * ++$x; 

// Do Pre-Increment 
$x = $x + 1; 
$x = 10 + 1; 
$x = 11; 

// Evaluate 
$y = $z * $x; 
$y = 5 * 11; 
$y = 55; 

En el caso de un for bucle en PHP, PHP evalúa un bucle como sigue:

for($i = 0; $i < 30; $i++) { 
    doSomething(); 
} 

// Is evaluated EXACTLY as such by PHP 

$i = 0; 
while($i < 30) { 
    doSomething(); 

    $i++; 
} 

Se evalúa la primera expresión ($i = 0) (ejecutado) incondicionalmente una vez al principio del bucle.

Al comienzo de cada iteración, se evalúa $i < 30. Si se evalúa como VERDADERO, el ciclo continúa y las declaraciones anidadas se ejecutan. Si se evalúa como FALSE, la ejecución del ciclo termina.

Al final de cada iteración, $i++ se evalúa (ejecuta) como una expresión independiente.

Por lo tanto, post-incremento o pre-incremento de una variable como la tercera expresión en el ciclo no tiene un efecto en el comportamiento de la misma. En este caso simple, ambas expresiones se comportarán exactamente igual.

Sin embargo, en un bucle de complejo tal como la siguiente:

for($i = $j = 0; $i < 30; $i += ++$j) { 
    $j = getResult($j); 
} 

Post-incrementar o pre-incrementando $j afecta directamente el valor de $i de acuerdo con los ejemplos anteriores. En este caso, debe elegir exactamente lo que desea hacer.

0
$i = 0; 
echo $i++; 
echo $i; 
$j=0; 
echo ++$j; 
echo $j; 

Incremento de la pantalla de incremento de valor incrementado. Pero el valor de visualización incremental de Post incrementa luego. Acerca del código será la salida 01 y 11

+0

Sea más descriptivo. –

Cuestiones relacionadas