c++ - que - ¿Cuál es la diferencia entre pre-incremento y post-incremento en el ciclo(para/mientras)?
que es pre incremento c++ (8)
Dado que la declaración i ++ termina en el ;
en su ejemplo, no hace ninguna diferencia si usa pre o post-incremento.
La diferencia surge cuando utilizas el resultado:
int j = i++; // i will contain i_old + 1, j will contain the i_old.
Vs:
int j = ++i; // i and j will both contain i_old + 1.
Mi interés está en la diferencia entre los bucles for
y while
. Sé que el valor de incremento posterior se usa y luego se incrementa y la operación devuelve un incremento previo constante.
while (true) {
//...
i++;
int j = i;
}
Aquí, ¿ j
contendrá la i
antigua o la i
post-incrementada al final del bucle?
Depende de cómo los uses.
-
i++
hace una copia, aumenta i y devuelve la copia (valor anterior). -
++i
aumenta i, y devuelve i.
En tu ejemplo, todo se trata de la velocidad. ++i
más rápido que i++
ya que no hace una copia.
Sin embargo, un compilador probablemente lo optimizará, ya que no está almacenando el valor devuelto por el operador de incremento en su ejemplo, pero esto solo es posible para tipos fundamentales como un int
.
En Pre-Incremento, el valor inicial se incrementa primero y luego se usa dentro de la expresión.
a=++i;
En este ejemplo, suponga que el valor de la variable i
es 5, luego el valor de la variable a
será 6 porque el valor de i
se modifica antes de usarlo en una expresión.
En Post-Increment, el valor se usa primero en una expresión y luego se incrementa.
a=i++;
En este ejemplo, suponga que el valor de la variable i
es 5, luego el valor de la variable a
será 5 porque el valor de i
se incrementa solo después de asignar el valor 5 a a
.
La diferencia entre post-y pre-incremento es realmente, en muchos casos, sutil. post incremenet, también conocido como num++
, primero crea una copia de num
, la devuelve y, luego , la incrementa. Antes del incremento, por otro lado, aka ++num
, primero evalúa, luego devuelve el valor. La mayoría de los compiladores modernos, al ver esto en un bucle, generalmente se optimizarán, principalmente cuando se usa el incremento posterior, y no se usa el valor inicial devuelto. La diferencia más importante entre los 2 incrementos, donde es realmente común hacer errores sutiles, es cuando se declaran variables, con valores incrementados: Ejemplo a continuación:
int num = 5;
int num2 = ++num; //Here, first num is incremented,
//then made 6, and that value is stored in num2;
Otro ejemplo:
int num = 5;
int num2 = num++; //Here, num is first returned, (unfortunately?), and then
//incremented. This is useful for some cases.
Lo último que quiero decir aquí es TENER CUIDADO CON LOS INCREMENTOS . Cuando declare variables, asegúrese de usar el incremento correcto, o simplemente escriba todo ( num2 = num + 1
, que no siempre funciona, y es el equivalente de pre-incremento). Se ahorrarán muchos problemas si utiliza el incremento correcto.
Respuesta básica para la comprensión. El operador de incremento funciona así:
// ++i
function pre_increment(i) {
i += 1;
return i;
}
// i++
function post_increment(i) {
copy = i;
i += 1;
return copy;
}
Un buen compilador reemplazará automáticamente i++
con ++i
cuando detecte que no se utilizará el valor devuelto.
i ++ usa el valor de i y luego lo incrementa, pero ++ i incrementa el valor de i antes de usarlo.
no importa si usa el incremento previo o posterior en una declaración independiente, excepto por el incremento previo, el efecto es inmediato
//an example will make it more clear:
int n=1;
printf("%d",n);
printf("%d",++n);// try changing it to n++(you''ll get to know what''s going on)
n++;
printf("%d",n);
salida: 123
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argp)
{
int x = 5;
printf("x=%d/n", ++x);
printf("x=%d/n", x++);
printf("x=%d/n", x);
return EXIT_SUCCESS;
}
Salida del programa:
x=6
x=6
x=7
En la primera declaración de printf, x se incrementa antes de pasar a printf, de modo que se genera el valor 6, en la segunda, se pasa a printf (entonces se genera 6) y luego se incrementa, y la tercera declaración de printf solo muestra ese incremento posterior a la anterior. declaración emitiendo x nuevamente que ahora tiene el valor 7.