2011-08-11 134 views
16

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?¿Cuál es la diferencia entre los operadores de prefijo y postfijo?

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

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

'retorno i ++' 'Volveré 10. retorno ++ I' volvería 11. – Nemo

+1

Porque lo que está sucediendo realmente son dos cosas, primero 'i' se devuelve y luego 'i' se está incrementando. Si escribe '++ i' entonces esas dos cosas suceden en el orden opuesto. – sketchyTech

+0

Al devolver 'i ++' se crea una expresión 'int i = i ++;'. Vamos a reescribir esto como 'int j = i ++;' por lo que es más fácil de explicar. Esta es la versión posterior a la corrección de 'i', que significa incrementar' i' después de establecer 'j = i'. Debido a que estos son enteros primitivos, 'i' está profundamente copiado a' j' (no es una copia superficial, con una referencia de puntero), y por lo tanto 'j = 10'. Entonces 'i' se incrementa, entonces' i = i + 1', y por lo tanto 'i = 11'. La versión anterior al arreglo incrementará 'i' antes de que se copie a' j', y por lo tanto ambas variables tendrán el mismo valor ('j = 11',' i = 11'). – tfmontague

Respuesta

10

La función devuelve antes de i se incrementa porque está utilizando un operador de post-fix (++). En cualquier caso, el incremento de i no es global, solo para la función respectiva. Si utilizó un operador de reparación previa, sería 11 y luego disminuiría a 10.

Así que luego devuelve i como 10 y lo disminuye en la función printf, que muestra 9 no 10 como cree.

4

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

La disminución del prefijo aumenta el valor de su operando antes de ha sido evaluado. El valor de --i es i - 1.

Incremento/disminución de prefijo cambian el valor antes de evaluar la expresión. Incremento/disminución de Postfix cambia el valor después.

Así, en su caso, fun(10) devuelve 10, y la impresión de grabados --ii - 1, que es 9.

2

Tiene que ver con la forma en que trabaja el operador de incremento posterior. Devuelve el valor de i y luego incrementa el valor.

3

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

1

fun (10) devuelve 10. Si desea que devuelva 11, entonces necesita utilizar ++ i en lugar de i ++.

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

En primer lugar, tenga en cuenta que el parámetro de función llamada 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.

En segundo lugar, utiliza el operador postincrement en fun(). Eso significa que el resultado de la expresión es el valor antes dei se incrementa; el valor final de 11 i simplemente se descarta, y la función devuelve 10. La variable i atrás en el principal, siendo una variable diferente, se le asigna el valor 10, que luego Disminuir para conseguir 9.

7

De hecho se return (i++) solo devuelve 10.

Los operadores ++ y - pueden colocarse antes o después de la variable, con diferentes efectos.Si son anteriores, serán procesados ​​y devueltos y tratados esencialmente como (i-1) o (i + 1), pero si coloca el ++ o - después del i, entonces el resultado es essentailly

return i; 
i + 1; 

Devuelve 10 y nunca lo incrementa.

28

Hay una diferencia grande entre las versiones de sufijo y el prefijo de ++.

En la versión 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 postfijo (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) 
  1. i se establece en 10 (fácil).
  2. dos cosas en esta línea:
    • i se incrementa a 11.
    • El nuevo valor dei se copia en j. Entonces j ahora es igual a 11.
  3. dos cosas en esta línea, así:
    • i se incrementa a 12.
    • El original valor de i (que es 11) se copia en k. Entonces k ahora es igual a 11.

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

lo mismo es válido para las versiones de sufijo y el prefijo de --.

+5

@ RenéG Excepto que 'i' ya estaba incrementado a' 11' en la línea anterior. –

+0

Me parece sorprendente que la gente todavía intente editar esta respuesta suponiendo que obtuve los números incorrectos. Todo lo que uno tiene que hacer es ejecutar este código e imprimir los valores para ver si estoy en lo correcto. –

+4

Los números son correctos, pero el código no se explica muy bien. Para una expresión prefijada 'int j = ++ i;', la variable 'i' se incrementa en uno (' i = i + 1', entonces 'i = 11'), y luego se copia profundamente en' j '(entonces' j = 11'). Y luego, para la expresión posterior al arreglo 'int k = i ++;', la variable 'i' (que sigue siendo' 11'), primero se copia profundamente a 'k' (entonces' k = 11'), y luego ' i' se incrementa en uno (entonces 'i = 12'). – tfmontague

8

Prefijo:

int a=0; 

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

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

Postfix:

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

primero asignar el valor de 'a' a 'b' a continuación, incrementar el valor de 'a'

2

En realidad lo que sucede es cuando se utiliza postfix es decir, i ++, el valor inicial de i se usa para regresar en lugar del incremento. Después de esto, el valor de i se incrementa en 1. Y esto sucede con cualquier instrucción que use i ++, es decir, el primer valor inicial de i se usa en la expresión y luego se incrementa.

Y sucede exactamente lo contrario en el prefijo. Si hubiera devuelto ++ i, se devuelve el valor incrementado, es decir 11, que se debe a que primero se realiza la adición 1 y luego se devuelve.

2

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 de i.

Paso 3: Dentro de laint fun(int i){ return (i++); }fun() que están regresando un valor return(i++). Devuelve 10. porque i++ es el operador posterior al incriminación.

Paso 4: A continuación, el control de nuevo a la función principal y el valor de 10 se asigna a la variable i.

Paso 5:printf("%d\n", --i); Aquí --i denotado pre-increement. Por lo tanto, imprime el valor 9.

1

Hay dos ejemplos ilustra la diferencia

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ; 
printf (" %d %d %d " , a , b , c++); 
  • Aquí c tiene un valor 0 c incrementan en 1 a continuación, asignar el valor 1 a un modo de valor de a = 1 y el valor de c = 1
  • próxima assiagn declaración valor de c = 1 a la letra b luego incremente c por 1 para valor de b = 1 y valor de

  • en printf declaración tenemos c++ esto significa que el valor original de c que es 2 será impresa a continuación, incrementar C, el 1 por lo printf comunicado se imprimirá 1 1 2 y el valor de c ahora es 3

que pueda utilizar http://pythontutor.com/c.html

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