這個是昨天寫的,但是今天才整理並貼出來~
是這樣的,C中的常識之一就是,const類型的值是不可修改的。
但是我昨天在看書的時候想到所有位於內存中的數據其實都是可以修改的,就用代碼嘗試了一下,代碼如下:
#include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; const int a = 10, b = 20; int c; int * np = (int *)&a; *np = 9; *(np + 1) = 19; c = a; cout << a << ends << b << ends << c << endl; return 0; }
代碼非常簡單,就是成名兩個const int變量,然后呢,我通過創建一個指針,通過顯式類型轉換,獲取a變量的地址。
然后呢,我通過這個指針,修改a的值。
調試結果是這樣的:
在這里可以看到,watch窗口中已經很清楚的顯示了,a和b的值已經被修改了!
但是輸出的結果卻還是a和b的原值。
這是為什么?
為此我查看了這段程序的匯編碼:
1 00401379 movl $0xa,0x18(%esp) 2 00401381 movl $0xa,0x4(%esp) 3 00401389 movl $0x4740c0,(%esp) 4 00401390 call 0x448630 <std::ostream::operator<<(int)> 5 00401395 movl $0x467640,0x4(%esp) 6 0040139D mov %eax,(%esp) 7 004013A0 call 0x44837c <std::ostream::operator<<(std::ostream& (*)(std::ostream&))> 8 004013A5 movl $0x14,0x4(%esp) 9 004013AD mov %eax,(%esp)
這里只截取了一部分,可以看到第一行的前兩個數字十進制都是10,第八行的那個數字是十進制中的20.
由此我推斷,在編譯階段,編譯器對於所有使用了const變量值的地方統統將其用其值來替換,而非去內存中尋址取值。
所以才會導致原變量的值已經被修改的情況下,還是輸出了原來的值。