Je dois donc découvrir pourquoi des valeurs spécifiques sont imprimées, et j'en ai résolu la plupart, mais j'ai un problème avec les trois dernières.
Je serais heureux de toute aide
int main(void) { int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 }; mess(&myValues[3]); //starts function mess } void mess(int *n) { printf("mess :%d\n", *n++); //prints value of 3rd index (1) and sets pointer to fourth index printf("mess: %d\n", *++n); //sets n to 5th index and prints its value printf("mess: %d\n", -2[n]); //value: -3 printf("mess: %d\n", (-2)[n]); //value: 1 printf("mess: %d\n", n[-6]); //value: 32766 }
Je ne comprends tout simplement pas comment les valeurs -3, 1 et 32766 se présentent
p>
3 Réponses :
printf("mess: %d\n", n[-6]); //value: 32766
ce n'est pas mon code, juste un code de notre prof. pour voir à quel point notre compréhension théorique de ce sujet est profonde ... Mais merci encore votre réponse aide beaucoup!
Tout d'abord, visualisons la mémoire pointée par n
, après l'exécution des deux premières instructions printf ()
:
int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 }; ??? ^ ^ // n-6 n-5 n
Voyons voir un par un
Instruction 1: printf ("mess:% d \ n", -2 [n]); // valeur: -3
Vérifiez la priorité des opérateurs . -2 [n]
est analysé comme - (2 [n])
. Ainsi, le -
est le signe, 2 [n]
est le même que n [2]
qui est la valeur 3 . Ainsi, la déclaration est la même que
int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 }; ^ ^ ^ // n-2 n n+2
Visualisation :
int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 }; ^ ^^ // n n+2
Instruction 2: printf ("mess:% d \ n", (-2) [n]); // valeur: 1
Ici, n [-2]
est identique à * (n-2)
. Le résultat est la valeur à cet index. (Vérifiez la visualisation ci-dessus).
Visualisation :
printf("mess: %d\n", -(n[2]) );
Enfin, Instruction 3: printf ("mess:% d \ n", n [-6]); // valeur: 32766
Selon le contenu actuel du pointeur n
, l'index le moins accessible est -5
, en essayant d'accéder à l'emplacement mémoire à un index -6 accède hors limites, provoque un un comportement indéfini . Le résultat ne peut être justifié.
Visualisation :
int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 }; ^ // n
Merci beaucoup. Le rend beaucoup plus incompréhensible
Tout d'abord, rappelez-vous qu'en C, l'indexation des tableaux est commutative - a [i]
et i [a]
donnent le même résultat.
Donc, la ligne
printf("mess: %d\n", n[-6]); //value: 32766
équivaut à écrire
printf("mess: %d\n", (-2)[n]); //value: 1
Le suffixe [] code> a une priorité plus élevée que l'opérateur unaire
-
, donc l'expression -2 [n]
est analysée comme - (2 [n]) code >. Vous indexez 2 éléments de
n
(3) et annulez le résultat.
Dans la ligne suivante,
printf( "mess: %d\n", -n[2] );
l'expression (-2) [n]
équivaut à n [-2]
- vous indexez 2 éléments avant n
, ce qui vous donne 1.
Dans la ligne
printf("mess: %d\n", -2[n]); //value: -3
vous essayez d'indexer 6 éléments avant n ; malheureusement, c'est en dehors des limites de votre tableau. À ce stade, le comportement n'est pas défini. Vous pourriez obtenir une sortie de déchets, le blocage de votre code ou autre chose pourrait se produire.
D'où vient ce code? Fuyez.
a [n]
est identique à* (a + n)
. Remplissez les blancs et vous obtenez votre résultat.c-faq.com/aryptr/joke.html
@EugeneSh. Nous apprenons en faisant. Rien à craindre.
@nicomp J'ai peur des institutions qui donnent aux étudiants des exercices qui enseignent de mauvaises choses.
@EugeneSh. Vous ne connaissez pas le contexte. Je donne à mes élèves du code avec des gotos, des noms de variables à une lettre, des commentaires incorrects et de nombreux autres exemples négatifs. Cela fait partie du processus d'apprentissage.