#define是乙個真常量,而const卻是由編譯器判斷實現的常量,嚴格來說是乙個偽常量;
在實際中,由const定義的常量其實仍然是乙個變數,只是編譯器在編譯過程中進行了檢查,發現修改就會報錯;
如果利用指標得到const int變數的位址,然後根據位址強制改變這個變數的值會有什麼情況呢?編譯器會不會報錯?
變數值會不會改變?
c++**如下:
void main()
001
很遺憾,結果輸出為:5
當程式執行到004的時候我們開啟除錯裡的variables表:
知道其實nvar的值已經被改動;
繼續執行到0005
可以發現雖然nvar的值早已修改為7,但是通過004語句的賦值並沒有使得_cgd=7;
這是因為nvar的值是已經確定的;雖然你可以通過記憶體修改它的值,改變這個變數在記憶體中的二進位制序列;但是
凡是以後**中有nvar的出現,
一律會被編譯器優化為初始值,也就是:5;而並不是將當前的nvar實際值進行賦值;
將上述c++**反彙編:
12: void main()
13:
0040161e 5f pop edi
0040161f 5e pop esi
00401620 5b pop ebx
00401621 83 c4 4c add esp,4ch
00401624 3b ec cmp ebp,esp
00401626 e8 75 f3 01 00 call __chkesp (004209a0)
0040162b 8b e5 mov esp,ebp
0040162d 5d pop ebp
0040162e c3 ret
const和define的區別以及const的優點
1 就起作用的階段而言 define是在編譯的預處理階段起作用 在預處理階段進行替換 而const是在編譯執行的時候起作用 const修飾的唯讀變數是在編譯的時候確定其值 2 就起作用的方式而言 define只是簡單的字串替換,沒有型別檢查。而const有對應的型別,是要進行判斷的,可以避免一些低階...
C 反彙編揭秘1 乙個簡單的C 程式反彙編解析
本系列主要從彙編角度研究c 語言機制和彙編的對應關係。第一篇自然應該從最簡單的開始。c 的源 如下 class my class void method int n my class private int m member int tmain int argc,tchar argv 可以直接deb...
C 虛函式呼叫的反彙編解析
虛函式的呼叫如何能實現其 虛 作為c 多型的表現手段,估計很多人對其實現機制感興趣。大約一般的教科書就說到這個c 強大機制的時候,就是教大家怎麼用,何時用,而不會去 一下這個虛函式的真正實現細節。當然,因為不同的編譯器廠家,可能對虛函式有自己的實現,呵呵,這就算是虛函式對於編譯器的 多型 了 作為編...