Rumah > pembangunan bahagian belakang > C++ > Mengapakah Mengubah Suai Pembolehubah `const` Melalui Penunjuk Bukan Const Nampak Berfungsi, tetapi Sebenarnya Tidak Mengubah Nilainya?

Mengapakah Mengubah Suai Pembolehubah `const` Melalui Penunjuk Bukan Const Nampak Berfungsi, tetapi Sebenarnya Tidak Mengubah Nilainya?

Mary-Kate Olsen
Lepaskan: 2024-10-28 08:35:02
asal
315 orang telah melayarinya

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn't Actually Change Its Value?

Mengubah suai const Melalui Penunjuk Bukan Const

Dalam C , pembolehubah const tidak boleh diubah suai setelah dimulakan. Walau bagaimanapun, dalam senario tertentu, nampaknya pembolehubah const telah diubah. Pertimbangkan kod berikut:

<code class="cpp">const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>
Salin selepas log masuk

Jika anda menjalankan kod ini, anda akan melihat tingkah laku yang tidak dijangka:

5
2
Salin selepas log masuk

Walaupun *w telah ditukar kepada 5 dalam (2), e masih mengekalkan nilai asalnya iaitu 2. Tingkah laku yang kelihatan paradoks ini berpunca daripada faktor-faktor berikut:

  • (1) Menyahrujuk penunjuk const (w) membenarkan pengubahsuaian.
  • (2 ) Nilai yang diubah suai disimpan dalam lokasi memori yang ditunjuk oleh w, yang dalam kes ini ialah lokasi memori di mana e disimpan.
  • Walau bagaimanapun, pengkompil mengoptimumkan kod, menganggap e sebagai pemalar masa kompilasi dan tidak menilainya pada masa jalan.

Akibatnya, apabila *w dinilai pada masa jalan, ia mengembalikan nilai yang diubah suai (5). Walau bagaimanapun, apabila e dinilai pada masa penyusunan, nilai asalnya (2) digunakan.

Tingkah laku ini dikenali sebagai tingkah laku tidak ditentukan dalam C . Mengubah suai pembolehubah const secara langsung atau tidak langsung membawa kepada akibat yang tidak dapat diramalkan dan berhati-hati harus dilakukan dalam situasi sedemikian.

Atas ialah kandungan terperinci Mengapakah Mengubah Suai Pembolehubah `const` Melalui Penunjuk Bukan Const Nampak Berfungsi, tetapi Sebenarnya Tidak Mengubah Nilainya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan