Tugasan Tatasusunan dalam C dan C : Pengecualian untuk Struktur dan Wawasan Falsafah
Dalam C dan C , menetapkan tatasusunan secara langsung adalah dilarang, seperti yang dicontohkan oleh yang berikut:
int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // Error: invalid array assignment
Walau bagaimanapun, pengecualian timbul apabila tatasusunan ialah komponen struct:
struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1;
Dalam kes ini, tatasusunan dalam struct boleh ditetapkan mengikut ahli. Ini menimbulkan persoalan mengapa penugasan tatasusunan mengikut ahli disokong untuk struct tetapi tidak secara amnya.
Rasional Evolusi
Asal usul tingkah laku tatasusunan terletak pada perkembangan sejarah daripada C. Dalam B dan BCPL, tatasusunan secara tersirat dianggap sebagai penunjuk yang tidak ditaip. Struktur dalam B memerlukan layanan khas untuk menampung tatasusunan, yang membawa kepada tatasusunan dalam struktur dikendalikan sebagai entiti yang dijejaki pengkompil.
Ini memerlukan penugasan tidak membenarkan tatasusunan secara umum, kerana ia memerlukan penilaian semula penunjuk asas tatasusunan. Untuk mengekalkan keserasian, penugasan tatasusunan tidak dibenarkan walaupun untuk tatasusunan dalam struktur.
Penugasan Struktur dan Kesan Sampingan
Apabila penetapan struct diperkenalkan dalam C, ia dilaksanakan sebagai memcpy ringkas memori mentah struct. Tingkah laku tugasan ini secara tidak sengaja diperluaskan kepada tatasusunan dalam struct.
Memandangkan penugasan struct sudah menjadi sebahagian daripada bahasa, sebarang percubaan untuk menukar gelagat tugasan tatasusunan mungkin telah memecahkan kod sedia ada. Akibatnya, penugasan tatasusunan dalam struct kekal sebagai pengecualian, walaupun yang tidak disengajakan.
Perspektif Falsafah
Dari perspektif reka bentuk bahasa, boleh dikatakan bahawa tatasusunan, tidak seperti structs, tidak pernah dimaksudkan sebagai warganegara kelas pertama. Kefungsian mereka sebagai penunjuk mengutamakan keserasian ke belakang berbanding potensi manfaat ergonomik.
Selain itu, memperkenalkan tugasan tatasusunan umum akan menyebabkan komplikasi, seperti kemungkinan mencipta penunjuk dan kebocoran memori secara tidak sengaja.
Kesimpulan
Sokongan untuk tugasan tatasusunan ahli dalam struct ialah artifak sejarah yang berpunca daripada evolusi awal C. Ia berterusan disebabkan kebimbangan keserasian dan berfungsi sebagai peringatan kepada falsafah reka bentuk asas bahasa yang mengutamakan kesederhanaan dan keserasian ke belakang.
Atas ialah kandungan terperinci Mengapakah Tugasan Tatasusunan Dibenarkan dalam Struktur tetapi Bukan untuk Tatasusunan Berdiri dalam C dan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!