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
156 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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!