Dalam C dan C , tandatangan fungsi mungkin termasuk panjang tatasusunan dalam kurungan segi empat sama, seperti int a[ 1]. Walau bagaimanapun, tingkah laku ini telah membingungkan pembangun, kerana panjangnya kelihatan tidak mempunyai kesan praktikal.
Pertimbangkan contoh berikut:
#include <iostream> int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
Dalam kod ini, fungsi dis mengisytiharkan parameter tatasusunan dengan panjang 1 (a[1]), tetapi mengakses a[2] masih boleh dilakukan. Ini menimbulkan persoalan: mengapa pengkompil membenarkan panjang tatasusunan dalam tandatangan fungsi jika ia tidak dikuatkuasakan?
Jawapannya terletak pada tingkah laku unik tatasusunan yang lulus dalam C/ C . Tidak seperti kebanyakan bahasa lain, C dan C tidak membenarkan penghantaran terus tatasusunan ke fungsi. Sebaliknya, penuding kepada elemen pertama tatasusunan dihantar.
Akibatnya, panjang tatasusunan yang dinyatakan dalam tandatangan fungsi menjadi tidak relevan. Maklumat panjang tidak disertakan dalam penunjuk, jadi pengkompil hanya mengabaikan panjang dalam kurungan.
Tingkah laku ini berpunca daripada keputusan yang dibuat semasa peringkat awal pembangunan C pada tahun 1970-an. Walaupun ia telah menyebabkan kekeliruan selama bertahun-tahun, sintaks tetap berleluasa dalam kedua-dua C dan C .
Keanehan hantaran tatasusunan ini mempunyai beberapa implikasi:
Atas ialah kandungan terperinci Mengapakah Panjang Tatasusunan dalam Tanda Tangan Fungsi C/C Diabaikan oleh Pengkompil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!