Dalam C , ahli statik kelas boleh diakses melalui penuding nol tanpa menggunakan gelagat yang tidak ditentukan. Tingkah laku ini, yang mungkin kelihatan mengejutkan, boleh dijelaskan dengan meneliti definisi dan rasional bahasa.
Apabila mengakses ahli kelas melalui penuding nol, tingkah lakunya adalah baik- ditakrifkan selagi penilaian operan tidak memerlukan identiti rujukan atau nilai tersimpan. Contohnya, mengakses pembolehubah ahli statik d->a hanya menilai ungkapan *(d) untuk mendapatkan rujukan kepada objek, tetapi tidak melakukan operasi yang memerlukan rujukan dimulakan.
Penilaian ini proses disokong oleh [expr.ref]/2, yang menyatakan bahawa d->a ditukar kepada ((d)).a. Penilaian ((d)), yang diwakili oleh *d, diteruskan tanpa mencetuskan sebarang ralat kerana objek yang dirujuk oleh d tidak diperlukan.
Piawaian C tidak menyatakan secara eksplisit bahawa acuan melalui penuding nol sememangnya menghasilkan tingkah laku yang tidak ditentukan. Malah, isu CWG #232 dan #315 mencadangkan bahawa penyimpangan semata-mata tidak bermasalah.
Hujah utama pendirian ini terletak pada kewujudan senario yang ditakrifkan dengan baik di mana penyimpangan melalui penunjuk nol dibenarkan. Sebagai contoh, [expr.typeid]/2 membenarkan typeid(*((A*)0)) membuang pengecualian bad_typeid, walaupun *d menilai kepada null. Jika UB secara tidak langsung digunakan, kenyataan ini tidak akan ditakrifkan dengan baik.
Dalam contoh anda,
<code class="cpp">int main() { demo* d = nullptr; d->fun(); std::cout << d->a; return 0; }</code>
program menyusun dan berjalan tanpa ralat kerana menggunakan fungsi ahli statik atau mengakses pembolehubah statik tidak memerlukan identiti rujukan. Oleh itu, program anda tidak mempunyai sebarang isu yang wujud atau tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Bolehkah Anda Mengakses Ahli Statik dalam C Menggunakan Penunjuk Null Tanpa Kelakuan Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!