Incremento previo frente a incremento posterior en matriz

4 minutos de lectura

Estoy aprendiendo programación y he empezado desde lenguaje C. Estaba leyendo el libro Let us C. Y yo estaba pasando por este programa en ese libro.

main( ) 
{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( "\n%d %d %d", i, j, m ) ; 
}

Según entendí, se imprimirá i as 2, j as 1 y m as 15

Pero de alguna manera se está imprimiendo como i as 3, j as 2 y m as 15? ¿Por que es esto entonces?

A continuación está mi entendimiento-

b = x++;
In this example suppose the value of variable ‘x’ is 5 then value of variable ‘b’ will be 5 because old value of ‘x’ is used.

b = ++y;
In this example suppose the value of variable ‘y’ is 5 then value of variable ‘b’ will be 6 because the value of ‘y’ gets modified before using it in a expression.

¿Hay algo mal en mi entendimiento?

avatar de usuario
Eric Wich

Le diste al clavo. Su comprensión es correcta. La diferencia entre las expresiones de incremento previo y posterior es tal como suena. El incremento previo significa que la variable se incrementa antes de establecer o evaluar la expresión. Post-incremento significa que la expresión se establece o evalúa, y luego se modifica la variable. Es fácil pensar en ello como un proceso de dos pasos.

b = x++;

realmente es:

b = x;
x++;

y

b = ++x;

realmente es:

x++;
b = x;

EDITAR: La parte complicada de los ejemplos que proporcionaste (que probablemente te desconcertó) es que hay una gran diferencia entre un índice de matriz y su valor.

i = ++a[1];

Eso significa incrementar el valor almacenado en un[1]y luego configúrelo en la variable i.

m = a[i++];

Este significa establecer m en el valor de a[i], luego incrementa i. La diferencia entre los dos es bastante grande y puede resultar confuso al principio.

Segunda EDICIÓN: desglose del código

{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( "\n%d %d %d", i, j, m ) ; 
}

Primero:

i = ++a[1];

En este punto conocemos un[1] = 1 (recuerde que las matrices están indexadas a cero). Pero lo incrementamos primero. Por lo tanto i = 2.

j = a[1]++;

Recuerda que incrementamos un[1] antes, por lo que actualmente es 2. Establecimos j = 2, y LUEGO lo incrementamos a 3. Entonces j = 2 y ahora un[1] = 3.

m = a[i++];

Sabemos que i = 2. Por lo tanto, debemos establecer m = a[2], y luego incrementa i. Al final de esta expresión, m = 15 e i = 3.

En resumen,

i = 3, j = 2, m = 15.

  • Gracias Eric por aclarar la duda, pero entonces, ¿por qué la salida del programa es tan diferente?

    usuario2442489

    1 de junio de 2013 a las 4:33

  • Edité el código nuevamente con un desglose detallado de lo que está sucediendo. Creo que está bastante claro, avísame si necesitas más aclaraciones. 😀

    – Eric Wich

    1 de junio de 2013 a las 4:43

  • Gracias Eric por la comprensión detallada.

    usuario2442489

    1 de junio de 2013 a las 4:53

avatar de usuario
Kartikeya Sinha

Su comprensión no es exactamente correcta. Los operadores de preincremento y posincremento son operadores unarios.

Entonces, inicialmente, si b = 5, entonces ++b o b++ incrementa el valor de b a 6. Sin embargo, la diferencia entre pre y post surge cuando usa un operador de asignación “=”.

Entonces,

if b=5
a=b++ // after this statement a=5 and b=6 as it is post increment
c=++b // after this statement c=7 and b=7

Para una comprensión clara, puede dividir las declaraciones anteriores como:

a=b;  
b=b+1; //post increment  
b=b+1; //pre increment  
c=b;`  

Entonces, el ejemplo que diste:

main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;  
 i = ++a[1] ; // a[1] = 2 and i = 2  
 j = a[1]++ ; // j = 2 and a[1] = 3  
 m = a[i++] ; // m = a[2++] = 15, i now becomes 3  
 printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15  
}

Para mayor claridad, estoy dividiendo el código anterior en varias declaraciones:

main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;
 a[1] = a[1] + 1;  
 i = a[1];  
 j = a[1];  
 a[1] = a[1] + 1;  
 m = a[i]; // m = a[2] = 15  
 i = i + 1;  
 printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15  
}

Espero que la explicación anterior aclare su duda y el resultado del programa que está ejecutando.

Explicación:

Paso 1: en un[5] = {5, 1, 15, 20, 25}; La variable arr se declara como una matriz de enteros con un tamaño de 5 y se inicializa a un[0] = 5, un[1] = 1, un[2] = 15, un[3] = 20, un[4] = 25 .

Paso 2: i, j, m; Las variables i,j,m se declaran como un tipo entero.

Paso 3: yo = ++a[1]; se convierte en i = ++1; Por lo tanto i = 2 y a[1] = 2

Etapa 4: j = un[1]++; se convierte en j = 2++; Por lo tanto j = 2 y a[1] = 3.

Paso 5: m = un[i++]; se convierte en m = un[2]; Por lo tanto, m = 15 y i se incrementa en 1 (i ++ significa 2 ++, por lo que i = 3)

Paso 6: printf(“%d, %d, %d”, i, j, m); Imprime el valor de las variables i, j, m

Por lo tanto, la salida del programa es 3, 2, 15

¿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