首頁  >  文章  >  後端開發  >  為什麼透過非 const 指標修改 const 變數看起來有效,但實際上並沒有改變它的值?

為什麼透過非 const 指標修改 const 變數看起來有效,但實際上並沒有改變它的值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-28 08:35:02138瀏覽

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

透過非常量指標修改 const

在 C 中,const 變數一旦初始化就無法修改。但是,在某些情況下,const 變數可能會被更改。考慮以下程式碼:

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

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

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>

如果執行此程式碼,您會注意到意外的行為:

5
2

儘管*w 在(2) 中變更為5, e 仍然保持其原始值2。這種看似矛盾的行為源自於以下因素:

  • (1) 取消引用 const 指標 (w) 允許修改。
  • (2 ) 修改後的值儲存在 w 指向的記憶體位置,在本例中就是儲存 e 的記憶體位置。
  • 但是,編譯器最佳化了程式碼,將 e 視為編譯時常數並且不在執行時對其求值。

因此,當在運行時求值 *w 時,它會傳回修改後的值 (5)。但是,當 e 在編譯時求值時,將使用其原始值 (2)。

這種行為在 C 稱為未定義行為。直接或間接修改 const 變數會導致不可預測的後果,在這種情況下應謹慎行事。

以上是為什麼透過非 const 指標修改 const 變數看起來有效,但實際上並沒有改變它的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn