2009-11-18 23 views
58

¿Cuál es la diferencia entre ++$i y $i++ en PHP?

Respuesta

69

++$i es un incremento previo, mientras que $i++ aumenta.

  • pre-subasta: incremento variable i primero y luego de-referencia.
  • post-incremento: de-referencia y después de la subasta i

"tomar ventaja del hecho de que PHP le permite post-incremento ($ i ++) y pre-incremento (++ $ i). El significado es el mismo siempre que no sea escribiendo algo como $ j = $ i ++, , sin embargo, el pre-incremento es casi 10% más rápido, lo que significa que debe cambiar incrementando cuando tiene la oportunidad, especialmente en bucles estrechos y especialmente si eres pedante sobre micro-optimizaciones! " - TuxRadar

Para más aclaración, post-incrementación en PHP se ha documentado como el almacenamiento de una variable temporal que atribuye a este 10% overhead vs. pre-incrementación.

+0

Estoy muy interesado en la fuente de su cotización. 10% me parece mucho – knittl

+6

¿Es esta una regla general, o es específica de PHP? – Zoidberg

+0

... la fuente aparece en mi respuesta. No lo he comprobado yo mismo ... Creo que podría ver el código fuente de PHP ... – jldupont

9
++$i //first increment $i then run line 
$i++ //first run line then increment $i 
+0

Eso es técnicamente una simplificación excesiva, piense en un bucle for, etc. –

3

Para explicar el punto de jldupont:

$i = 1; 
$x = $i++; 
echo $x; // prints 1 
$x = ++$i; 
echo $x; // prints 3 
4

Diferencia es: ++$i incrementará $i variable y devolver el valor actualizado, mientras que $i++ volverá valor original, por lo que se incrementará.

$prefix = 1; 
$postfix = 1; 
echo ++$prefix; // 2 
echo $postfix++; // 1 
1

Probablemente sea mejor ilustrado con un ejemplo ...

post-subasta:

$zero = 0; 
$n = $zero++; //$n is zero 

pre-subasta:

$zero = 0; 
$n = ++$zero; //$n is one 
34

++$i es pre-incrementación

  1. $i se incrementa
  2. el nuevo valor se devuelve

$i++ es posterior a la incrementación

  1. el valor de $i copiado a una variable temporal interna
  2. $i se incrementa
  3. la copia interna de la vieja Se devuelve el valor de $i
25

++$i incrementos $i, sino que evalúa al valor de $i+1 $i++ incrementos $i, pero se evalúa al valor antiguo de $i.

He aquí un ejemplo:

$i = 10; 
$a = $i++; 
// Now $a is 10, and $i is 11 

$i = 10; 
$a = ++$i; 
// Now $a is 11, and $i is 11 

A veces hay un costo Preformance ligero para el uso de $i++. Ve, cuando haces algo como

$a = $i++; 

que realmente estás haciendo esto:

$temporary_variable = $i; 
$i=$i+1; 
$a=$temporary_variable; 
1

Respuesta corta:

  • Prefijo aumenta el valor y devuelve el valor aumentó
  • Postfix aumenta el valor y devuelve el valor antes de aumentar
  • prefijo es más rápido

Respuesta larga: Si usted piensa un poco sobre él, cómo se llevaría a cabo los mismo, es probable que darse cuenta de qué prefijo es más rápido. A decir verdad, es en realidad de sufijo (a menudo) implementado usando prefijo:

const T T::operator ++ (int) // postfix 
    { 
    T orig(*this); 
    ++(*this); // call prefix operator 
    return (orig); 
    } 

Evitar postfix a menos que tenga una razón específica para no hacerlo. La diferencia de velocidad puede ser bastante grande para tipos de datos complejos.

De hecho, miré esto hace unos días.Heres my source.

3

Otra forma de ver el incremento previo y posterior es que es una abreviatura para combinar 2 afirmaciones.

Pre-incrementando

// long form 
$y = $y + 1; 
$x = $y; // any statement using $y 

// shorthand 
$x = ++$y; // the same statement using $y 

post-incremento

// long form 
$x = $y; // any statement using $y 
$y = $y + 1; 

// shorthand 
$x = $y++; // the same statement using $y 
9

en este caso no hay diferencia:

for($i = 0;$i<3;++$i)var_dump $i; 
/* 
int(0) 
int(1) 
int(2) 
*/ 
for($i = 0;$i<3;$i++)var_dump $i; 
/* 
int(0) 
int(1) 
int(2) 
*/ 

pero:

for($i = 0;$i<3; $j = ++$i)var_dump($j); 
/* 
NULL 
int(1) 
int(2) 
*/ 
for($i = 0;$i<3; $j = $i++)var_dump($j); 
/* 
NULL 
int(0) 
int(1) 
*/ 
+0

Esto es útil, el incremento del prefijo parece tener la menor sorpresa. Voy a cambiar a usar siempre el incremento de prefijo ahora. – CMCDragonkai

0

Ejecuté el siguiente código para probar si ++ $ i es un 10% más rápido que $ i ++. Lo admito, el código no tiene un resultado estable, pero incluso entonces debería haber visto algunos números cerca del 10%. Lo más alto que obtuve fue 4-4.5% aproximadamente.

<?php 

$randomFloat = rand(0, 10)/10; 

$before1 = microtime(true); 

for($i=0; $i <1000000; ++$i){ 
    $rand = (rand(0, 10)/10) * (rand(0, 10)/10); 
} 

$after1 = microtime(true); 
echo 'it took '.($after1-$before1) . ' seconds fot ++$i<br />'; 

$before2 = microtime(true); 

for($i=0; $i <1000000; $i++){ 
    $rand = (rand(0, 10)/10) * (rand(0, 10)/10); 
} 

$after2 = microtime(true); 
echo 'it took '.($after2-$before2) . ' seconds fot $i++<br /><br />'; 

echo '++$i is '.((($after1-$before1)*100)/($after2-$before2)-100).'% faster than $i++'; 
3

El propósito principal del operador de incremento posterior a la solución es el uso de la siguiente manera:

while(*condition*) 
    $array[$i++] = $something; 

Esta es una manera muy elegante, la forma de moverse por algunas iteraciones de la matriz. Desglose:

  1. variable $ algo va a ser asignado al elemento de matriz indexada con $ i
  2. $ variable i se incrementa
  3. iteración se encuentra al final, condición será comprobado

En todos los demás casos, debe usar el operador de prefijo. Hace que el código sea mucho más claro (puede estar seguro de que ya trabaja con el valor incrementado de una variable particular).

+0

Upvoted para recomendar el uso del prefijo a menos que un postfix sea estrictamente necesario. – developerbmw

2

este ejemplo elplains simplemente

<?php 

     $x = 10; 

     echo $x++. ' '.$x; // the result is 10 and 11 

     echo "<br>"; 

     $y = 10; 

     echo ++$y. ' ' .$y; // the result is 11 and 11 

// so the $x++ is not showing +1 at first but the next time 
// and the ++y is showing +1 first time but not increasing next 

?> 
+0

Gracias por el simple ejemplo. Entiendo ahora. – Praditha

Cuestiones relacionadas