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