[問題] 修改 const int x = 100;

看板C_and_CPP作者 (小乖)時間14年前 (2010/04/29 10:18), 編輯推噓4(4013)
留言17則, 3人參與, 最新討論串1/2 (看更多)
之前再思考有關 bitwise const 以及 logical const 的問題 我就隨手寫了一個更改 const int 的程式 ============================== #include <iostream> using namespace std; int main() { const int x = 100; int* py = const_cast<int*>(&x); *py = 9; cout << "(addr,value) of x ==> " << "(" << hex << &x << "," << dec << x << ")" << endl; cout << "(addr,value) of *py ==> " << "(" << hex << py << "," << dec << *py << ")" << endl; return 0; } =============================== 原本以為會印出來如下: (addr,value) of x ==> (xxx,9) // xxx 代表某 address (addr,value) of *py ==> (xxx,9) 結果卻出乎我意料之外: (addr,value) of x ==> (xxx,100) // xxx 代表某 address (addr,value) of *py ==> (xxx,9) 同一個位置上的值卻不一樣 = = (我對 const 的認知好像又被顛覆了 = =) 我在 VS 2008 和 gcc 3.4.5 version 上跑都是一樣的結果。 4239篇 dotwsc 大大有類似的問題 (但他用的 compiler 可以改動到 const 的值) 是不是 C++ 的標準規格又多了甚麼限制嗎? 還是甚麼原因 請教各位 謝謝 @@") -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.170.154

04/29 10:28, , 1F
如果我沒記錯 用強制轉換去掉const的pointer來做賦值的動
04/29 10:28, 1F

04/29 10:29, , 2F
作本來就是undefined behavior...結果一樣只是碰巧吧?
04/29 10:29, 2F

04/29 10:31, , 3F
我改成 C 的寫法用 c compiler 可以修改
04/29 10:31, 3F

04/29 10:31, , 4F
我一直都覺得強制轉型在多數情況下都是錯誤的設計才會產生
04/29 10:31, 4F

04/29 10:32, , 5F
簡單來說 const_cast只是把const去掉以適應某些狀況
04/29 10:32, 5F

04/29 10:32, , 6F
但不表示你可以去修改這個值..改了會發生什麼事我也不知道
04/29 10:32, 6F

04/29 10:51, , 8F
上面網站上有個說法,我覺得還不錯可以參考
04/29 10:51, 8F

04/29 17:19, , 9F
有甚麼例子 一定要做這種轉型不可 是為了省一個
04/29 17:19, 9F

04/29 17:19, , 10F
指標宣告 還是有啥不這樣做 交代不過去的道理?
04/29 17:19, 10F

04/29 17:20, , 11F
還是只是為了測試很零散片斷的程式語意
04/29 17:20, 11F

04/29 17:21, , 12F
我覺得只用兩個變數來作SWAP 還比這種有趣多了
04/29 17:21, 12F

04/29 18:41, , 13F
一個const物件要傳給使用非const參數的func就會使用到
04/29 18:41, 13F

04/29 18:42, , 14F
當然最好是當你確定整個func中不會改變物件內容時把參數設
04/29 18:42, 14F

04/29 18:42, , 15F
為const是最好的方式 不過世上func何其多...XD
04/29 18:42, 15F

04/29 22:03, , 16F
但那是必要的嗎? 一個常數你透過轉型去改變它
04/29 22:03, 16F

04/29 22:03, , 17F
那就破壞了你的常數定義了
04/29 22:03, 17F
文章代碼(AID): #1BsEoJzp (C_and_CPP)
文章代碼(AID): #1BsEoJzp (C_and_CPP)