¿Cuál es la diferencia entre los operadores de prefijo y posfijo?

6 minutos de lectura

avatar de usuario
Pradeep

El siguiente código imprime un valor de 9. ¿Por qué? Aquí return(i++) devolverá un valor de 11 y debido a --i el valor debería ser 10 en sí mismo, ¿alguien puede explicar cómo funciona esto?

#include<stdio.h>
main()
{
    int i= fun(10);
    printf("%d\n",--i);
}

int fun (int i)
{
    return(i++);
}

  • return i++ regresará 10. return ++i volvería 11.

    – Nemo

    11/08/2011 a las 19:00

  • Porque lo que realmente está pasando son dos cosas, primero i está siendo devuelto y luego i se está incrementando. Si tú escribes ++i entonces esas dos cosas suceden en el orden opuesto.

    – SketchyTech

    3 de julio de 2014 a las 13:21

  • Al regresar i++ se crea una expresión int i = i++;. Reescribamos esto como int j = i++; así es más fácil de explicar. Esta es la versión post-fix de ilo que significa incremento i después de configurar j = i. Porque estos son números enteros primitivos, i se copia profundamente a j (no es una copia superficial, con una referencia de puntero), y por lo tanto j = 10. Entonces i se incrementa, por lo que i = i + 1y por lo tanto i = 11. La versión de prefijo, se incrementará i antes de que se copie en jy por lo tanto ambas variables tendrán el mismo valor (j = 11, i = 11).

    – tim-montague

    17 de febrero de 2017 a las 1:39


  • @tfmontague Esa explicación realmente merece estar en una respuesta en lugar de un comentario.

    –Ken Wayne VanderLinde

    17 de febrero de 2017 a las 2:31

  • Solo agregando un comentario aquí, para personas como yo. También tienen otra diferencia: geeksforgeeks.org/g-fact-59 compruébelo para ver la diferencia de prioridades.

    – III_phr

    22 de noviembre de 2021 a las 20:59

avatar de usuario
Ken Wayne Vander Linde

Hay un grande diferencia entre las versiones de postfijo y prefijo de ++.

En la versión de prefijo (es decir, ++i), El valor de i se incrementa, y el valor de la expresión es el nuevo valor de i.

En la versión sufijo (es decir, i++), El valor de i se incrementa, pero el valor de la expresión es el original valor de i.

Analicemos el siguiente código línea por línea:

int i = 10;   // (1)
int j = ++i;  // (2)
int k = i++;  // (3)
  1. i se establece en 10 (fácil).
  2. Dos cosas en esta línea:
    • i se incrementa a 11.
    • Él nuevo valor de i se copia en j. Asi que j ahora es igual 11.
  3. Dos cosas en esta línea también:
    • i se incrementa a 12.
    • Él original valor de i (cual es 11) se copia en k. Asi que k ahora es igual 11.

Así que después de ejecutar el código, i serán 12 pero ambos j y k serán 11.

Lo mismo vale para las versiones de postfijo y prefijo de --.

  • @RenéG Excepto que i ya se incrementó a 11 en la línea anterior.

    –Ken Wayne VanderLinde

    13 de mayo de 2016 a las 2:44

  • Me parece notable que la gente todavía esté tratando de editar esta respuesta asumiendo que me equivoqué con los números. Todo lo que uno tiene que hacer es ejecutar este código e imprimir los valores para ver que estoy en lo correcto.

    –Ken Wayne VanderLinde

    16 de diciembre de 2016 a las 5:06


  • Los números son correctos, pero el código no se explica muy bien. Para una expresión de prefijo int j = ++i;La variable i se incrementa en uno (i = i + 1asi que i = 11), y luego se copia en profundidad a j (asi que j = 11). Y luego para la expresión post-fix int k = i++;La variable i (que sigue siendo 11), primero se copia en profundidad en k (asi que k = 11), y luego i se incrementa en uno (por lo que i = 12).

    – tim-montague

    17 de febrero de 2017 a las 2:07


  • @tfmontague Avísame si crees que esto es mejor.

    –Ken Wayne VanderLinde

    17 de febrero de 2017 a las 2:29

  • También agregaría a esto que las categorías de valor de las expresiones difieren. i++ es una expresión prvalue y ++i es una expresión de valor L.

    – Wally

    30 de abril de 2019 a las 14:26

avatar de usuario
Dilu Gracias

Prefijo:

int a=0;

int b=++a;          // b=1,a=1 

antes de la asignación se incrementará el valor de.

Sufijo:

int a=0;
int b=a++;  // a=1,b=0 

primero asigne el valor de ‘a’ a ‘b’ luego incremente el valor de ‘a’

La función regresa antes i se incrementa porque está utilizando un operador de corrección posterior (++). En cualquier caso, el incremento de i no es global, solo a la función respectiva. Si hubiera utilizado un operador de prefijo, sería 11 y luego se decrementa a 10.

Entonces vuelves i como 10 y disminuirlo en la función printf, que muestra 9 no 10 Como se puede pensar.

De hecho return (i++) solo devolverá 10.

Los operadores ++ y — se pueden colocar antes o después de la variable, con diferentes efectos. Si están antes, entonces serán procesados ​​y devueltos y esencialmente tratados como (i-1) o (i+1), pero si coloca ++ o — después de la i, entonces el retorno es esencialmente

return i;
i + 1;

Entonces devolverá 10 y nunca lo incrementará.

Hay dos ejemplos que ilustran la diferencia.

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , c++);
  • Aquí c tiene el valor 0 c se incrementa en 1 y luego asigna el valor 1 a un valor so de a = 1 y valor de c = 1
  • siguiente declaración asignar valor de c = 1 a b luego incremente c en 1 por lo que el valor de b = 1 y valor de c = 2

  • en printf declaración que tenemos c++ esto significa que el valor original de c, que es 2, se imprimirá y luego se incrementará c en 1, por lo que printf se imprimirá la declaración 1 1 2 y el valor de c ahora es 3

puedes usar http://pythontutor.com/c.html

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , ++c);
  • Aquí en printf declaración ++c incrementará el valor de c en 1 primero y luego asignará un nuevo valor 3 a c para que printf se imprimirá la declaración 1 1 3

avatar de usuario
Rafe Kettler

El incremento del sufijo ++ no aumenta el valor de su operando hasta después de haber sido evaluado. El valor de i++ es i.

El decremento del prefijo aumenta el valor de su operando antes de ha sido evaluado. El valor de --i es i - 1.

El incremento/decremento del prefijo cambia el valor antes de que se evalúe la expresión. El incremento/decremento del sufijo cambia el valor después.

Entonces, en tu caso, fun(10) devuelve 10 e imprimiendo --i huellas dactilares i - 1que es 9.

avatar de usuario
Guardar

i++ es incremento posterior. El incremento tiene lugar después de que se devuelve el valor.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad