Maison >développement back-end >C++ >Est-ce que 2[arr] = 5 compile et passe l'assertion en C et C ?

Est-ce que 2[arr] = 5 compile et passe l'assertion en C et C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-03 07:17:10267parcourir

Does 2[arr] = 5 Compile and Pass Assertion in C and C  ?

Accès aux tableaux par index[array] en C et C

Dans un test de connaissances parfois posé par les enquêteurs, le code suivant est présenté :

int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?

Il peut sembler au départ que l'expression 2[arr] ne devrait pas réussir à se compiler, car elle semble tenter d'indexer un tableau en utilisant un entier comme nom du tableau. Cependant, cette syntaxe inattendue est effectivement valable à la fois en C et en C.

Pour comprendre pourquoi, examinons les détails techniques de l'opérateur [] dans ces langages.

C et C Sémantique d'accès aux tableaux

Selon la norme C99 (6.5.2.1 paragraphe 1), l'opérateur [] attend des arguments dans la forme :

  • Une expression de type pointeur vers objet
  • Une expression de type entier
  • Expression résultante du même type que l'objet

De plus, le paragraphe 2 de la même section explique que E1[E2] est équivalent à (*((E1) (E2))). Cela indique que l'expression E1[E2] peut être interprétée comme une manipulation de pointeur :

  • E1 est converti en pointeur vers l'élément initial d'un tableau.
  • E2 est ajouté à le pointeur, ce qui donne un nouveau pointeur qui pointe vers le E2-ième élément du tableau.
  • Le déréférencement du pointeur résultant renvoie la valeur de l'élément sélectionné élément de tableau.

Essentiellement, il n'y a aucune exigence dans la norme selon laquelle l'ordre des arguments pour [] soit sain d'esprit. Par conséquent, l'expression 2[arr] est traitée comme équivalente à (*((2) (arr))).

  • 2, un entier, est ajouté à un pointeur pointant vers le premier élément de arr.
  • Le pointeur résultant pointe vers le troisième élément de arr.
  • Déréférencer le pointeur résultant (c'est-à-dire accéder arr[2]) attribue la valeur 5 au troisième élément.

Par conséquent, l'affectation et l'assertion ultérieure réussissent, comme prévu.

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:
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