web-dev-qa-db-fra.com

Pré-incrément vs post-incrément dans le tableau

J'apprends la programmation et je suis parti du langage C. Je lisais le livre Let us C. Et je passais par ce programme dans ce livre.

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

Ma compréhension était, il imprimera i as 2, j as 1 et m as 15

Mais en quelque sorte, il imprime en tant que i as 3, j as 2 et m as 15? Pourquoi en est-il ainsi?

Voici ma compréhension-

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.

Y a-t-il quelque chose qui cloche dans ma compréhension?

21
user2442489

Vous frappez le clou sur la tête. Votre compréhension est correcte. La différence entre les expressions pré et post-incrémentation est exactement comme si cela semblait. La pré-incrémentation signifie que la variable est incrémentée avant que l'expression ne soit définie ou évaluée. La post-incrémentation signifie que l'expression est définie ou évaluée, puis la variable est modifiée. Il est facile de le considérer comme un processus en deux étapes.

b = x++;

est vraiment:

b = x;
x++;

et

b = ++x;

est vraiment:

x++;
b = x;

EDIT: La partie délicate des exemples que vous avez fournis (ce qui vous a probablement ébranlé) est qu'il y a une énorme différence entre un index de tableau et sa valeur.

i = ++a[1];

Cela signifie incrémenter la valeur stockée à a [1], puis la définir sur la variable i.

m = a[i++];

Celui-ci signifie mettre m à la valeur de [i], puis incrémenter i. La différence entre les deux est une distinction assez importante et peut être déroutante au début.

Deuxième EDIT: décomposition du code

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

Première:

i = ++a[1];

À ce stade, nous connaissons a [1] = 1 (rappelez-vous que les tableaux sont indexés zéro). Mais nous l'incrémentons d'abord. Donc i = 2.

j = a[1]++;

Rappelez-vous que nous avons incrémenté un [1] auparavant, il est donc actuellement de 2. Nous définissons j = 2, puis nous l'avons incrémenté à 3. Donc j = 2 et maintenant a [1] = 3.

m = a[i++];

Nous savons que i = 2. Nous devons donc définir m = a [2], puis incrémenter i. À la fin de cette expression, m = 15 et i = 3.

En résumé,

i = 3, j = 2, m = 15.
37
Eric Wich

Votre compréhension n'est pas tout à fait correcte. Les opérateurs pré-incrément et post-incrément sont des opérateurs unaires.

Donc, initialement si b = 5, alors ++ b ou b ++ incrémente la valeur de b à 6. Cependant, la différence entre pré et post se produit lorsque vous utilisez un opérateur d'affectation "=".

Alors,

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

Pour une compréhension claire, vous pouvez diviser les déclarations ci-dessus comme suit:

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

Donc, l'exemple que vous avez donné:

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  
}

Pour plus de clarté, je divise le code ci-dessus en plusieurs instructions:

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  
}

J'espère que l'explication ci-dessus efface votre doute et la sortie du programme que vous exécutez.

5
Kartikeya Sinha

Explication:

Étape 1: int a [5] = {5, 1, 15, 20, 25}; La variable arr est déclarée comme un tableau entier avec une taille de 5 et elle est initialisée à a [0] = 5, a [1] = 1, a [2] = 15, a [3] = 20, a [4 ] = 25.

Étape 2: int i, j, m; La variable i, j, m est déclarée comme un type entier.

Étape 3: i = ++ a [1]; devient i = ++ 1; Donc i = 2 et a [1] = 2

Étape 4: j = a [1] ++; devient j = 2 ++; D'où j = 2 et a [1] = 3.

Étape 5: m = a [i ++]; devient m = a [2]; Donc m = 15 et i est incrémenté de 1 (i ++ signifie 2 ++ donc i = 3)

Étape 6: printf ("% d,% d,% d", i, j, m); Il imprime la valeur des variables i, j, m

D'où la sortie du programme est 3, 2, 15

1
Setu Kumar Basak