Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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?

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
Barbara Streisandasal
2024-10-28 04:47:02227semak imbas

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>

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!

Kenyataan:
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