Bien que la forme typique d'indexation de tableau soit array[index], C et C fournissent une syntaxe alternative : index[tableau]. Cette syntaxe a intrigué de nombreux programmeurs, mais est-elle valide par les spécifications du langage ?
int arr[] = {1, 2, 3}; 2[arr] = 5; // Does this compile? assert(arr[2] == 5); // Does this assertion fail?
Cette question piège repose sur la nature commutative de ajout. L'opération index[array] est convertie en *(index array), et comme l'addition est commutative, on pourrait supposer que 2[arr] et arr[2] sont équivalents. Cependant, cela n'est pas explicitement indiqué dans les spécifications linguistiques.
Oui, le code est valide selon les spécifications C et C.
C99 (6.5.2.1, paragraphe 1) :
One of the expressions shall have type "pointer to object type", the other expression shall have integer type, and the result has type "type".
C99 (6.5.2.1, paragraphe 2) :
A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).
Ces spécifications n'exigent pas que l'ordre des arguments de [] soit sain d'esprit. Par conséquent, les deux lignes du code se compilent et s'exécutent comme prévu, et l'assertion réussit.
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!