Teka-teki Tugasan Tatasusunan: Memahami Ralat C2106
Dalam C , percubaan untuk menetapkan satu tatasusunan kepada tatasusunan yang lain boleh mencetuskan ralat terkenal C2106. Mesej yang penuh teka-teki ini membingungkan ramai pengaturcara, membuatkan mereka tertanya-tanya mengapa operasi mudah seperti itu dilarang. Mari kita mendalami rasional asas di sebalik sekatan ini.
Bertentangan dengan jangkaan intuitif, tatasusunan dalam C tidak boleh ditetapkan. Tidak seperti pembolehubah skalar, yang boleh diberikan nilai baharu secara bebas, tatasusunan tidak memiliki keupayaan ini kerana sifat semula jadinya sebagai agregat saiz tetap. Sebabnya terletak pada butiran pelaksanaan yang rumit tatasusunan dalam C . Dalam istilah yang paling mudah, peruntukan memori tatasusunan pada asasnya berbeza daripada pembolehubah skalar, menjadikan penetapan langsung secara teknikal tidak dapat dilaksanakan.
Akibat daripada pengehadan ini, cuba untuk menetapkan satu tatasusunan kepada yang lain, seperti dalam contoh yang diberikan , mencetuskan ralat C2106. Pengkompil mengesan tugasan yang tidak betul dan memberi isyarat bahawa operan kiri, dalam kes ini, nilai tatasusunan, mestilah nilai l, bermakna pembolehubah yang boleh diubah suai. Tatasusunan, walau bagaimanapun, sememangnya tidak boleh diubah suai dengan cara ini, justeru berlaku ralat.
Jika keperluan berterusan untuk mencontohi fungsi tugasan tatasusunan, pengaturcara mempunyai pilihan alternatif yang boleh digunakan. Satu pendekatan melibatkan penggunaan ciri C moden, iaitu kelas std::array atau bekas vektor std::. Ini menawarkan tingkah laku seperti tatasusunan yang diingini sambil mematuhi peraturan pengaturcaraan berorientasikan objek, membenarkan penetapan nilai yang mudah.
Sebagai alternatif, bagi mereka yang dikekang menggunakan tatasusunan gaya C warisan, menyalin elemen melalui gelung atau menggunakan fungsi seperti std::copy menyediakan penyelesaian yang berdaya maju. Dengan menyalin setiap elemen tatasusunan secara manual, kesan penugasan satu tatasusunan kepada tatasusunan yang lain boleh dicapai secara tidak langsung.
Perlu diperhatikan nuansa tambahan mengenai pemulaan tatasusunan. Dalam contoh, tatasusunan nilai dimulakan dengan senarai pendakap kerinting kosong {}. Sintaks trengkas ini bergantung pada standard C, yang menentukan bahawa elemen agregat yang tidak ditentukan adalah nilai yang dimulakan. Dalam kes integer, ini sama dengan permulaan semua elemen yang tidak ditentukan kepada sifar. Oleh itu, kedua-dua pendekatan pemula tatasusunan eksplisit dan teknik senarai pemula kosong menghasilkan hasil yang sama.
Atas ialah kandungan terperinci Mengapa C Melemparkan Ralat C2106 Apabila Menetapkan Tatasusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!