Pemulaan Kendiri Pembolehubah Tidak Dimulakan: Bahaya dan Piawaian
Coretan kod C/C di bawah:
int i = i;
telah menimbulkan kebimbangan dalam kalangan pembangun, kerana ia menggunakan pembolehubah yang tidak dimulakan untuk memulakan dirinya sendiri. Penyusun moden menerima kod ini tanpa amaran, menimbulkan persoalan tentang kesahihannya dan kelakuan asas yang ditakrifkan oleh piawaian.
Penerimaan dan Piawaian Pengkompil
Mengikut piawaian C11, pembolehubah yang tidak dimulakan mempunyai nilai yang tidak tentu, yang boleh menjadi nilai yang tidak ditentukan atau perwakilan perangkap. Dalam situasi di mana nilai tak tentu menjadi nilai perangkap, menggunakannya boleh membawa kepada gelagat tidak ditentukan jika pelaksanaan menyokong bit padding dalam integer.
Walau bagaimanapun, jika pelaksanaan tidak menggunakan padding, nilainya tidak ditentukan, dan tiada gelagat yang tidak ditentukan.
Senario Tidak Ditakrifkan
Tingkah laku menggunakan pembolehubah tidak diinisialisasi untuk permulaan kendiri menjadi lebih tidak dapat diramalkan jika alamat pembolehubah tidak pernah diambil . Bahagian 6.3.2.1p2 piawaian C11 menjelaskan bahawa penggunaan sedemikian tidak ditentukan untuk objek tempoh storan automatik yang boleh diisytiharkan dengan kelas storan daftar.
Implikasi
Walaupun penerimaan pengkompil, menggunakan pembolehubah yang tidak dimulakan untuk permulaan kendiri adalah tidak digalakkan amalan. Ia boleh membawa kepada tingkah laku yang salah atau potensi tingkah laku yang tidak ditentukan bergantung pada pelaksanaan, menjadikan kod itu tidak boleh dipercayai. Sentiasa mulakan pembolehubah secara eksplisit untuk mengelakkan perangkap ini.
Atas ialah kandungan terperinci Adakah Permulaan Kendiri Pembolehubah Tidak Dimulakan dalam C/C Gelagat Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!