Pembolehubah Malar dan Manipulasi Alamat
Dalam C , pembolehubah malar menyediakan cara untuk menentukan nilai yang sepatutnya kekal tidak berubah semasa pelaksanaan program. Walau bagaimanapun, adalah penting untuk memahami kemungkinan akibat memanipulasi alamat memori pembolehubah const.
Coretan kod di bawah menunjukkan tingkah laku menarik yang berkaitan dengan pembolehubah const dan manipulasi alamat:
#include <iostream> using namespace std; int main() { const int N = 22; int * pN = const_cast<int *>(&N); *pN = 33; cout << N << '\t' << &N << endl; cout << *pN << '\t' << pN << endl; }
Ini kod mencetak output berikut:
22 0x22ff74 33 0x22ff74
Tanpa diduga, kedua-dua pembolehubah const asal N dan penunjuk pN menunjuk ke alamat memori yang sama, dan nilai pada alamat itu telah diubah suai kepada 33.
Penjelasan
Pengkompil dibenarkan untuk mengoptimumkan akses kepada pembolehubah const , memperlakukan mereka seolah-olah nilai mereka digantikan secara langsung. Dalam kes ini, pengkompil mungkin menentukan bahawa memandangkan N ialah pembolehubah const, nilainya tidak akan berubah, jadi ia boleh menggantikan sebarang rujukan kepada *pN dengan N secara langsung.
Pengoptimuman ini membolehkan penjanaan kod dan ingatan yang cekap pengurusan. Walau bagaimanapun, ia juga membayangkan bahawa sebarang percubaan untuk mengubah suai nilai pada alamat memori pembolehubah const akan dianggap sebagai pengubahsuaian pembolehubah const itu sendiri.
Amaran Pengkompil
Perlu ambil perhatian bahawa kod di atas mungkin menjana amaran pengkompil tentang mengubah suai pembolehubah const. Walaupun pengkompil dibenarkan untuk mengoptimumkan akses kepada pembolehubah const, ia masih dianggap sebagai amalan yang baik untuk mengelakkan manipulasi sedemikian, kerana ia boleh membawa kepada tingkah laku yang tidak dijangka atau pepijat halus.
Atas ialah kandungan terperinci Bolehkah Menangani Manipulasi Pembolehubah Malar dalam C Membawa kepada Gelagat Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!