Accès aux tableaux par index [Array] en C et C : une curiosité commutative
La question énigmatique qui laisse perplexe les enquêteurs est la suivante :
int arr[] = {1, 2, 3}; 2[arr] = 5; // Compiles? assert(arr[2] == 5); // Fails?
L'intuition suggère que a[b] se traduit par *(a b) et, puisque l'addition est commutatif, 2[arr] devrait être égal à *(2 arr).
La norme confirme-t-elle cela ?
En effet, les normes C et C approuvent ce comportement .
Norme C (C99) :
Section 6.5.2.1, paragraphe 1 :
L'une des expressions doit être de type "pointeur vers le type d'objet", l'autre expression doit être de type entier et le résultat doit être de type "type".
Paragraphe 2 (c'est nous qui soulignons) :
Une expression postfixée suivie d'une expression entre crochets [] est une désignation en indice d'un élément d'un tableau objet. La définition de l'opérateur d'indice [] est que E1[E2] est identique à (*((E1) (E2))). En raison des règles de conversion qui s'appliquent à l'opérateur binaire, si E1 est un objet tableau (de manière équivalente, un pointeur vers l'élément initial d'un objet tableau) et E2 est un entier, E1[E2] désigne le E2-ème élément de E1 (en comptant à partir de zéro).
Conclusion
La norme indique sans équivoque que E1[E2] est équivalent à *(E1 E2), quel que soit l'ordre des arguments. Par conséquent, 2[arr] donne le même résultat que arr[2], permettant à la fois à l'affectation et à l'assertion de réussir sans sourciller.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!