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?
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.
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.
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