Mengakses Tatasusunan mengikut Indeks [Array] dalam C dan C : Rasa Ingin Tahu Komutatif
Soalan penuh teka-teki yang membingungkan penemuduga bertanya:
int arr[] = {1, 2, 3}; 2[arr] = 5; // Compiles? assert(arr[2] == 5); // Fails?
Gerakan menunjukkan bahawa a[b] diterjemahkan kepada *(a b) dan, memandangkan penambahan adalah komutatif, 2[arr] sepatutnya bersamaan dengan *(2 arr).
Adakah Standard Menyokong Ini?
Memang, C dan Piawaian C menyokong tingkah laku ini.
Piawaian C (C99):
Seksyen 6.5.2.1, perenggan 1:
Salah satu ungkapan hendaklah mempunyai jenis "penunjuk kepada jenis objek", ungkapan lain hendaklah mempunyai jenis integer, dan hasilnya mempunyai jenis "jenis".
Perenggan 2 (penekanan ditambah):
A postfix ungkapan diikuti dengan ungkapan dalam kurungan segi empat sama [] ialah sebutan subskrip bagi elemen objek tatasusunan. Takrif operator subskrip [] ialah E1[E2] adalah sama dengan (*((E1) (E2))). Oleh kerana peraturan penukaran yang digunakan pada pengendali binari, jika E1 ialah objek tatasusunan (setara, penunjuk kepada elemen awal objek tatasusunan) dan E2 ialah integer, E1[E2] menetapkan elemen E2-ke-E1 (mengira dari sifar).
Kesimpulan
Piawaian dengan tegas menyatakan bahawa E1[E2] bersamaan dengan *(E1 E2), tanpa mengira susunan hujah. Oleh itu, 2[arr] menghasilkan hasil yang sama seperti arr[2], membolehkan kedua-dua tugasan dan penegasan berjaya tanpa menaikkan kening.
Atas ialah kandungan terperinci Adakah `2[arr]` Sama dengan `arr[2]` dalam C dan C : A Commutative Array Access?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!