Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Menetapkan Tatasusunan Secara Terus, Tetapi Saya Boleh Dalam Structs dalam C/C ?

Mengapa Saya Tidak Boleh Menetapkan Tatasusunan Secara Terus, Tetapi Saya Boleh Dalam Structs dalam C/C ?

Susan Sarandon
Susan Sarandonasal
2024-12-19 22:49:09471semak imbas

Why Can't I Assign Arrays Directly, But I Can Within Structs in C/C  ?

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;//&lt ;/pre>__), seperti yang ditunjukkan di bawah:</p>
<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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn