Mengapakah mengubah suai nilai `const` melalui penuding bukan const membawa kepada tingkah laku yang tidak ditentukan tetapi masih mencetak nilai yang berbeza untuk penunjuk dan pembolehubah asal?

Barbara Streisand
Lepaskan: 2024-10-28 04:47:02
asal
226 orang telah melayarinya

Why does modifying a `const` value through a non-const pointer lead to undefined behavior but still print different values for the pointer and the original variable?

Mengubah suai const melalui Penunjuk Bukan const

Pertimbangkan kod berikut:

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

int* w = (int*) &e;          // (1) cast to remove const-ness
*w = 5;                        // (2)

cout << *w << endl;            // (3) outputs 5
cout << e << endl;             // (4) outputs 2

cout << "w = " << w << endl;   // (5) w points to the address of e
cout << "&e = " << &e << endl;</code>
Salin selepas log masuk

Dalam (1 ), w menunjuk ke alamat e. Dalam (2), nilai itu ditukar kepada 5. Walau bagaimanapun, apabila nilai *w dan e dipaparkan, nilainya berbeza. Tetapi jika anda mencetak penunjuk w dan alamat e, ia mempunyai nilai yang sama.

Kenapa e masih mengandungi 2, walaupun ia ditukar kepada 5? Adakah mereka disimpan di lokasi yang berasingan? Atau sementara? Tetapi bagaimanakah nilai yang ditunjukkan oleh w masih merupakan alamat e?

Jawapan

Setelah anda mengubah suai nilai const, anda memasuki wilayah tingkah laku yang tidak ditentukan. Walau bagaimanapun, untuk membuat spekulasi:

  • (3) dan (4): *w dinilai pada masa jalan, manakala e dianggap sebagai pemalar masa kompilasi. Oleh itu, nilai cetakan yang berbeza.

Atas ialah kandungan terperinci Mengapakah mengubah suai nilai `const` melalui penuding bukan const membawa kepada tingkah laku yang tidak ditentukan tetapi masih mencetak nilai yang berbeza untuk penunjuk dan pembolehubah asal?. 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!