Mengapa Array Memberwise Assignment Hanya Disokong Dalam Struktur
Tidak seperti tatasusunan secara umum, tatasusunan yang ditakrifkan dalam struct menikmati tugasan ahli. Semasa memberikan tatasusunan kepada yang lain tidak dibenarkan (__
num1 = num2;//), ia menjadi boleh dilaksanakan dalam struct (
struct1 = struct2;//< ;/pre>__), seperti yang ditunjukkan di bawah:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1;
Rasional Sejarah dan Falsafah
Perbezaan ini berpunca daripada evolusi C. Pada lelaran awal, tatasusunan pada asasnya adalah penunjuk tanpa maklumat saiz. Ini menghalang tugasan mereka, kerana pengkompil tidak mempunyai data yang diperlukan. Namun begitu, tatasusunan dalam struct mendapat manfaat daripada rawatan yang luar biasa, mewarisi maklumat jenis dan saiznya daripada struct yang disertakan. Akibatnya, mereka boleh ditugaskan mengikut ahli dalam konteks struct, tidak terjejas oleh kekangan umum.
Amalan ini telah dibawa ke C dan C moden, satu kebiasaan yang menyelesaikan cabaran pelaksanaan untuk menetapkan tatasusunan terbuka. Memperkenalkan tugasan tatasusunan umum akan memperkenalkan isu kekaburan dan keserasian. Jadi, pengehadan telah dikekalkan dan pengaturcara digalakkan untuk menggunakan memcpy untuk penyalinan tatasusunan eksplisit.
Pengecualian
Parameter fungsi telah muncul sebagai tetapan lain di mana ahli tatasusunan boleh ditugaskan. Pertimbangkan kod berikut:
typedef int vec[3]; void f(vec a, vec b) { a = b; // pointer assignment }
Walaupun a ialah parameter penuding, tugasan secara berkesan melaksanakan salinan mengikut elemen, walaupun berada di luar struktur. Pengecualian ini pada asasnya ialah peningkatan yang membolehkan nilai semantik dalam panggilan fungsi.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menetapkan Tatasusunan Secara Terus, Tetapi Saya Boleh Dalam Structs dalam C/C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!