Rumah > Artikel > pembangunan bahagian belakang > Mengapakah ia dibenarkan untuk mengakses ahli statik menggunakan penuding nol dalam C ?
Pertimbangkan program berikut:
<code class="cpp">#include <iostream> class Demo { public: static void func() { std::cout << "func() called" << std::endl; } static int num = 9; }; int main() { Demo* d = nullptr; d->func(); std::cout << d->num << std::endl; return 0; }
Atur cara ini menyusun dan berjalan tanpa ralat, manakala mengakses ahli statik melalui penuding nol secara amnya dianggap kelakuan tidak ditentukan. Mengapa ini dibenarkan?
TL;DR:
Program yang diberikan tidak mencetuskan tingkah laku yang tidak ditentukan kerana arahan melalui penuding nol tidak sememangnya bermasalah melainkan ia melibatkan operasi selanjutnya yang bergantung pada identiti objek yang sah.
Penjelasan:
Sama ada acuan melalui penunjuk nol adalah tingkah laku yang tidak ditentukan secara intrinsik telah menjadi perdebatan. . Satu-satunya operasi yang boleh dipersoalkan dalam program ini ialah penilaian ungkapan d->a.
d->a adalah bersamaan dengan (*d).a disebabkan oleh peraturan penyahrujukan penunjuk. Walau bagaimanapun, walaupun *d tidak ditakrifkan, ungkapan *d masih dinilai, terutamanya apabila keputusannya dibuang, seperti dalam kes d->a. Tingkah laku ini ditakrifkan dengan baik.
Tingkah laku dengan ahli statik adalah berbeza daripada mengakses ahli bukan statik melalui penuding nol, yang sepatutnya mencetuskan gelagat yang tidak ditentukan kerana ia menunjukkan identiti objek yang tidak sah. Mengakses ahli statik, sebaliknya, tidak memerlukan identiti objek dan tingkah laku mereka ditakrifkan secara eksplisit dalam standard.
Program yang diberikan tidak mendatangkan sebarang bahaya kerana penilaian *d dibenarkan dalam konteks mengakses ahli statik. Arahan melalui penunjuk nol sahaja tidak semestinya menyebabkan tingkah laku yang tidak ditentukan, tetapi adalah penting untuk mengetahui potensi risiko yang berkaitan dengan operasi selanjutnya yang memerlukan identiti objek.
Atas ialah kandungan terperinci Mengapakah ia dibenarkan untuk mengakses ahli statik menggunakan penuding nol dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!