用const 修飾的數值,1般是不可修改的,但在C語言中,可以通過變量的地址來修改其內容。
const 修飾的數值已被修改了。
但是如果在C++中這么做,那末編譯器會報錯,說明C++的編譯檢查更加嚴格,那末依照通過變量地址來修改其變量的想法,進行修改。
i 的數值沒有產生變化?!
調試:
在調試結果中,i 的數值已是100了,打印的結果卻還是原來的數值,通過反匯編代碼可以看到,push 0AH。
也就是在打印的時候,并沒有從i 的地址中重新去取數值,而是直接將i原始的結果push進去,所以結果沒有變化。
是否是所有const修飾的數值,其使用和賦值都是通過原始的數值,而不是再從地址去數值?
簡單測試代碼:
結果:
果然在C++中,從反匯編結果中知道,用const修飾的數值,在使用的時候,不會再從與本來的地址中取數值了,應當是用const修改的數值,被寄存在寄存器中了,直接從寄存器中取值,而不會再從地址取值。
一樣1段代碼,如果用C語言編譯,則會從本來的地址中取值。
總結:在反匯編代碼中,加上 const 與沒有加上 const 的反匯編代碼是1樣的,說明const 對實際代碼并沒有產生特別的影響,那末可知,const 只影響到編譯器,也就是編譯器會對const指向的數值進行檢查,所以嚴格來講,const 修飾的不是1個常量,而是編譯器的1種編譯檢查,應當說是變量的不可修改性。
對const修飾的變量,在使用時:
在C語言中,會從本來的變量地址中,獲得數值。(便可以通過變量的地址來修改const修飾的變量)
在C++語言中,不會從本來的變量地址中獲得數值。(即即便通過變量的地址成功修改變量了,其變量在使用時,由于不會從地址中獲得數值,所以還是本來的數值,說明C++的編譯機制,更加保證了const修飾的變量的不可修改性)