¿Cuál es la diferencia entre los operadores de prefijo y postfijo?
postfix-operator prefix-operator (12)
El siguiente código imprime un valor de 9. ¿Por qué? En este caso, return(i++)
devolverá un valor de 11 y, debido a que --i
el valor debería ser 10, ¿puede alguien explicar cómo funciona esto?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d/n",--i);
}
int fun (int i)
{
return(i++);
}
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, se procesarán y se devolverán y se tratarán esencialmente como (i-1) o (i + 1), pero si coloca ++ o - después de i, la devolución es esencialmente
return i;
i + 1;
Así que devolverá 10 y nunca lo incrementará.
El incremento ++
postfix no aumenta el valor de su operando hasta después de que se haya evaluado. El valor de i++
es i
.
El decremento de prefijo aumenta el valor de su operando antes de que se haya evaluado. El valor de --i
es i - 1
.
El incremento / decremento de prefijo cambia el valor antes de que se evalúe la expresión. El incremento / decremento de Postfix cambia el valor después
Entonces, en su caso, fun(10)
devuelve 10, e imprimiendo --i
imprime i - 1
, que es 9.
En realidad, lo que sucede es que cuando se usa postfix, es decir, i ++, el valor inicial de i se usa para devolver en lugar del incrementado. Después de esto, el valor de i se incrementa en 1. Y esto sucede con cualquier declaración que use i ++, es decir, el primer valor inicial de i se usa en la expresión y luego se incrementa.
Y lo contrario ocurre exactamente en el prefijo. Si hubiera devuelto ++ i, entonces se devuelve el valor incrementado, es decir, 11, lo cual se debe a que agregar 1 se realiza primero y luego se devuelve.
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 valor 0 c incremento por 1, luego asigne valor 1 a un valor de
a = 1
y valor dec = 1
El siguiente valor de asiagn de declaración de
c = 1
a b, luego incrementa c en 1, de modo queb = 1
y valor dec = 2
en la declaración
printf
tenemosc++
esto significa que el valor original de c que es 2 se imprimirá y luego incrementará c en 1, por lo que la declaraciónprintf
imprimirá1 1 2
y el valor de c ahora es 3
puede utilizar http://pythontutor.com/c.html
int a , b , c = 0 ;
a = ++c ;
b = c++ ;
printf (" %d %d %d " , a , b , ++c);
- Aquí, en la declaración de
printf
,++c
incrementará el valor de c en 1 primero y luego asignará el nuevo valor de 3 a c, por lo que la declaración deprintf
se imprimirá1 1 3
Hay una gran diferencia entre las versiones de prefijo y postfix de ++
.
En la versión del 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 postfix (es decir, i++
), el valor de i
se incrementa, pero el valor de la expresión es el valor original 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 en10
(fácil). - Dos cosas en esta línea:
-
i
se incrementa a11
. - El nuevo valor de
i
se copia enj
. Entoncesj
ahora es igual a11
.
-
- Dos cosas en esta línea también:
-
i
se incrementa a12
. - El valor original de
i
(que es11
) se copia enk
. Entoncesk
ahora es igual a11
.
-
Entonces, después de ejecutar el código, tendré 12, pero tanto j
como k
serán 11.
Lo mismo vale para las versiones de prefijo y postfix de --
.
La función regresa antes de que i
se incremente porque está utilizando un operador posterior a la reparación (++). En cualquier caso, el incremento de i
no es global, solo a la función respectiva. Si hubiera utilizado un operador de corrección previa, sería 11
y luego se reduciría a 10
.
Entonces, devuelve i
como 10 y lo decrementa en la función printf, que muestra 9
no 10
como usted piensa.
Primero, tenga en cuenta que el parámetro de función llamado i
y la variable llamada i
en main()
son dos variables diferentes. Creo que eso no importa mucho en la presente discusión, pero es importante saberlo.
Segundo, usas el operador de postincremento en fun()
. Eso significa que el resultado de la expresión es el valor antes de que se incremente i
; el valor final 11 de i
simplemente se descarta, y la función devuelve 10. A la variable i
nuevo en main, al ser una variable diferente, se le asigna el valor 10, que luego decrementa para obtener 9.
Tiene que ver con la forma en que funciona el operador post-incremento. Devuelve el valor de i y luego incrementa el valor.
fun (10) devuelve 10. Si desea que devuelva 11, entonces necesita usar ++ i en lugar de i ++.
int fun(int i)
{
return ++i;
}
i ++ es el incremento posterior. El incremento tiene lugar después de que se devuelve el valor.
Explicación:
Paso 1: int fun(int);
Aquí declaramos el prototipo de la función fun()
.
Paso 2: int i = fun(10);
La variable i se declara como un tipo entero y el resultado de la fun(10)
se almacenará en la variable i
.
Paso 3: int fun(int i){ return (i++); }
int fun(int i){ return (i++); }
Dentro de la fun()
estamos devolviendo un valor de return(i++)
. Devuelve 10
. porque i++
es el operador posterior al incremento.
Paso 4: Luego, el control vuelve a la función principal y el valor 10
se asigna a la variable i
.
Paso 5: printf("%d/n", --i);
Aquí - --i
denotado pre-incremento. Por lo tanto, se imprime el valor 9
.
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 aumente el valor de ''a''