Maison > développement back-end > C++ > Est-ce que `2[arr]` est égal à `arr[2]` en C et C : un accès commutatif aux tableaux ?

Est-ce que `2[arr]` est égal à `arr[2]` en C et C : un accès commutatif aux tableaux ?

Susan Sarandon
Libérer: 2024-11-25 14:42:11
original
912 Les gens l'ont consulté

Does `2[arr]` Equal `arr[2]` in C and C  : A Commutative Array Access?

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?
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal