Walaupun bentuk biasa pengindeksan tatasusunan ialah tatasusunan[indeks], C dan C menyediakan sintaks alternatif: indeks[array]. Sintaks ini telah membingungkan ramai pengaturcara, tetapi adakah ia sah mengikut spesifikasi bahasa?
int arr[] = {1, 2, 3}; 2[arr] = 5; // Does this compile? assert(arr[2] == 5); // Does this assertion fail?
Soalan helah ini bergantung pada sifat komutatif bagi tambahan. Indeks operasi[array] ditukar kepada *(array indeks), dan memandangkan penambahan adalah komutatif, kita mungkin menganggap bahawa 2[arr] dan arr[2] adalah bersamaan. Walau bagaimanapun, ini tidak dinyatakan secara eksplisit dalam spesifikasi bahasa.
Ya, kod itu sah mengikut spesifikasi C dan C.
C99 (6.5.2.1, perenggan 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, perenggan 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).
Spesifikasi ini tidak memerlukan susunan hujah untuk [] menjadi waras. Oleh itu, kedua-dua baris dalam kod menyusun dan melaksanakan seperti yang dijangkakan, dan penegasan berlalu.
Atas ialah kandungan terperinci Adakah `index[array]` Sintaks Akses Tatasusunan yang Sah dalam C dan C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!