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
809 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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal