En C, ¿cuál es la diferencia entre usar ++i
y i++
, y cuál debe usarse en el bloque de incremento de un bucle for
?
++i
incrementará el valor de i
, y luego devolverá el valor incrementado.
i = 1;
j = ++i;
(i es 2, j es 2)
i++
incrementará el valor de i
, pero devolverá el valor original que tenía i
antes de ser incrementado.
i = 1;
j = i++;
(i es 2, j es 1)
Para un bucle for
, cualquiera de los dos funciona. Parece más común el uso de ++i
, quizás porque es lo que se usa en K&R.
En cualquier caso, siga la directriz "prefiera ++i
a i++
" y no se equivocará.
Hay un par de comentarios sobre la eficiencia de ++i
y i++
. En cualquier compilador que no sea de proyecto, no habrá diferencia de rendimiento. Puedes comprobarlo mirando el código generado, que será idéntico.
La cuestión de la eficiencia es interesante... aquí está mi intento de respuesta: https://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i
Como señala On Freund, es diferente para un objeto C++, ya que operator++()
es una función y el compilador no puede saber que debe optimizar la creación de un objeto temporal para mantener el valor intermedio.
++i
incrementa el valor y lo devuelve.
i++
devuelve el valor, y luego lo incrementa.
Es una diferencia sutil.
Para un bucle for, usa ++i
, ya que es ligeramente más rápido. i++
creará una copia extra que será desechada.
La razón por la que ++i
puede ser ligeramente más rápido que i++
es que i++
puede requerir una copia local del valor de i antes de que se incremente, mientras que ++i
nunca lo hace. En algunos casos, algunos compiladores lo optimizarán si es posible... pero no siempre es posible, y no todos los compiladores lo hacen.
Yo intento no confiar demasiado en las optimizaciones de los compiladores, así que seguiría el consejo de Ryan Fox: cuando puedo usar ambas cosas, uso ++i
.