
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++);
}

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)
i
se establece en 10
(fácil).
- 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
.
- 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 --
.

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

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 - 1
que es 9.

Guardar
i++ es incremento posterior. El incremento tiene lugar después de que se devuelve el valor.
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 luegoi
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ónint i = i++;
. Reescribamos esto comoint j = i++;
así es más fácil de explicar. Esta es la versión post-fix dei
lo que significa incrementoi
después de configurarj = i
. Porque estos son números enteros primitivos,i
se copia profundamente aj
(no es una copia superficial, con una referencia de puntero), y por lo tantoj = 10
. Entoncesi
se incrementa, por lo quei = i + 1
y por lo tantoi = 11
. La versión de prefijo, se incrementarái
antes de que se copie enj
y 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