Pregunta ¿Cuál es la diferencia entre ++ i y i ++?


En C, ¿cuál es la diferencia entre usar ++i y i++, y que debe usarse en el bloque de incremento de for ¿lazo?


648
2017-08-24 05:19


origen


Respuestas:


  • ++i incrementará el valor de i, y luego devuelve el valor incrementado.

     i = 1;
     j = ++i;
     (i is 2, j is 2)
    
  • i++ incrementará el valor de i, pero devuelve el valor original que i celebrado antes de ser incrementado.

     i = 1;
     j = i++;
     (i is 2, j is 1)
    

Para for loop, o funciona. ++i parece más común, tal vez porque eso es lo que se usa en K & R.

En cualquier caso, siga la pauta "prefiera ++i encima i++"y no te equivocarás".

Hay un par de comentarios sobre la eficiencia de ++i y i++. En cualquier compilador que no sea de proyecto de estudiante, no habrá diferencia de rendimiento. Puede verificar esto mirando el código generado, que será idéntico.

La pregunta sobre eficiencia es interesante ... aquí está mi intento de respuesta: ¿Hay una diferencia de rendimiento entre i ++ y ++ i en C?

Como En Freund notas, es diferente para un objeto C ++, ya que operator++() es una función y el compilador no puede saber para optimizar la creación de un objeto temporal para mantener el valor intermedio.


815
2017-08-24 05:23



i ++ que se conoce como Incremento de publicación mientras ++ i se llama Pre Incremento

i++

i++ es un incremento posterior porque aumenta ivalor de 1 en 1 después de que la operación haya terminado.

Veamos el siguiente ejemplo:

int i = 1, j;
j = i++;

Aquí el valor de j = 1 pero i = 2. Aquí el valor de i será asignado a j primero luego i será incrementado

++i 

++i es un incremento previo porque aumenta ivalor por 1 antes de la operación. Significa j = i; se ejecutará después i++.

Veamos el siguiente ejemplo:

int i = 1, j;
j = ++i;

Aquí el valor de j = 2 pero i = 2. Aquí el valor de i será asignado a j después de la i  incremento de i. similar ++i será ejecutado antes j=i;.

Para tu pregunta que debería usarse en el bloque de incremento de un ciclo for la respuesta es que puedes usar cualquiera ... no importa. Ejecutará su bucle for igual no. de veces

for(i=0; i<5; i++)
   printf("%d ",i);

Y

for(i=0; i<5; ++i)
   printf("%d ",i);

Ambos bucles producirán la misma salida. es decir 0 1 2 3 4.

Solo importa dónde lo estás usando.

for(i = 0; i<5;)
    printf("%d ",++i);

En este caso, la salida será 1 2 3 4 5.


139
2018-03-28 05:54



Por favor, no te preocupes por la "eficiencia" (velocidad, en realidad) de la que uno es más rápido. Tenemos compiladores en estos días que se ocupan de estas cosas. Use cualquiera que tenga sentido usar, según lo que muestre más claramente su intención.


30
2017-09-20 05:06



++i incrementa el valor, luego lo devuelve.

i++ devuelve el valor y luego lo incrementa.

Es una diferencia sutil.

Para un bucle for, use ++i, ya que es un poco más rápido. i++ creará una copia extra que simplemente será desechada.


25
2017-08-24 05:21



i ++: - En este escenario, primero se asigna el valor y luego ocurre el incremento.

++ i: - En este escenario, primero se realiza el incremento y luego se asigna el valor

A continuación se muestra la visualización de la imagen y también aquí hay un buen video práctico ( http://www.youtube.com/watch?v=lrtcfgbUXm4) que demuestra lo mismo.

enter image description here


17
2017-07-25 07:42



La razón ++i  poder ser un poco más rápido que i++ es eso i++ puede requerir una copia local del valor de i antes de que se incremente, mientras ++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.

Intento no confiar demasiado en las optimizaciones de los compiladores, así que seguiría el consejo de Ryan Fox: cuando puedo usar ambas, uso ++i.


17
2017-08-24 06:00



El resultado efectivo de usar cualquiera es idéntico. En otras palabras, el ciclo hará exactamente lo mismo en ambos casos.

En términos de eficiencia, podría haber una penalización relacionada con la elección de i ++ sobre ++ i. En términos de la especificación del idioma, el operador de post-incremento debe crear una copia adicional del valor en el que actúa el operador. Esto podría ser una fuente de operaciones adicionales.

Sin embargo, debe considerar dos problemas principales con la lógica anterior.

  1. Los compiladores modernos son geniales. Todos los buenos compiladores son lo suficientemente inteligentes como para darse cuenta de que están viendo un incremento de enteros en for-loop, y optimizarán ambos métodos con el mismo código eficiente. Si usar el incremento posterior al incremento previo hace que tu programa tenga un tiempo de ejecución más lento, entonces estás usando un terrible compilador.

  2. En términos de complejidad de tiempo operacional, los dos métodos (incluso si se está realizando una copia) son equivalentes. El número de instrucciones que se realizan dentro del ciclo debe dominar significativamente el número de operaciones en la operación de incremento. Por lo tanto, en cualquier bucle de tamaño significativo, la penalización del método de incremento quedará ensombrecida de forma masiva por la ejecución del cuerpo del bucle. En otras palabras, es mucho mejor que te preocupes por optimizar el código en el ciclo en lugar del incremento.

En mi opinión, todo el tema simplemente se reduce a una preferencia de estilo. Si crees que el pre-incremento es más legible, entonces úsalo. Personalmente, prefiero el post-proceso, pero probablemente sea porque fue lo que me enseñaron antes de saber nada sobre la optimización.

Este es un ejemplo por excelencia de optimización prematura, y problemas como este tienen el potencial de distraernos de problemas serios en el diseño. Sin embargo, es una buena pregunta, porque no hay uniformidad en el uso o el consenso en las "mejores prácticas".


11
2018-05-06 21:36



++ i es pre-incremento el otro es post-incremento

i ++: obtiene el elemento y luego lo incrementa.
++ i: incrementa i y luego devuelve el elemento

Ejemplo:

int i = 0;
printf("i: %d\n", i);
printf("i++: %d\n", i++);
printf("++i: %d\n", ++i);

Salida:

i: 0
i++: 0
++i: 2

4
2017-09-17 12:23



++ i (operación de prefijo): aumenta y luego asigna el valor
(por ejemplo): int i = 5, int b = ++ i
       En este caso, 6 se asigna a b primero y luego se incrementa a 7 y así sucesivamente.

i ++ (operación Postfix): asigna y luego incrementa el valor
(por ejemplo): int i = 5, int b = i ++
       En este caso, 5 se asigna a b primero y luego a 6 y así sucesivamente.

En caso de bucle for: i ++ se usa principalmente porque, normalmente usamos el valor de inicio de i antes de incrementar para bucle. Pero dependiendo de la lógica de su programa, puede variar.


4
2018-05-13 05:50



Ambos incrementan el número. ++ i es equivalente a i = i + 1.

i ++ y ++ i son muy similares pero no exactamente iguales. Ambos incrementan el número, pero ++ incrementa el número antes de que se evalúe la expresión actual, mientras que i ++ incrementa el número después de evaluar la expresión.

Ejemplo:

int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3

4
2018-02-19 05:04



Supongo que ahora entiendes la diferencia en semántica (aunque sinceramente me pregunto por qué la gente pregunta "¿qué quiere decir el operador X" en desbordamiento de pila en lugar de leer, ya sabes, un libro o tutorial web o algo así.

Pero de todos modos, en cuanto a cuál usar, ignore las preguntas sobre el rendimiento, que son poco probable, incluso en C ++. Este es el principio que debes usar al decidir cuál usar:

Di lo que quieres decir en código.

Si no necesita el valor antes de incremento en su extracto, no use esa forma del operador. Es un problema menor, pero a menos que esté trabajando con una guía de estilo que prohíbe uno versión a favor del otro en conjunto (también conocido como una guía de estilo de cabeza de hueso), debe usar la forma que más exactamente expresa lo que estás tratando de hacer.

QED, use la versión de pre-incremento:

for (int i = 0; i != X; ++i) ...

3
2017-08-04 17:20