修改const變量的值


這個是昨天寫的,但是今天才整理並貼出來~

是這樣的,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變量值的地方統統將其用其值來替換,而非去內存中尋址取值。

所以才會導致原變量的值已經被修改的情況下,還是輸出了原來的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM