2016-01-13 162 views
0

我有以下代碼:指向const的指針。指針改變,但const的沒有變化

int main(void) { 
    const int a = 2; 
    int *p = (int *)&a; 
    ++*p; 
    cout << a << endl << *p << endl; 
    cout << &a << endl << p << endl; 

    return 0; 
} 

指針指向const int a但是當我改變*指針。 *p = 3a = 2;
雖然p和a具有相同的地址。
我不知道如何創建這個結果。 任何人都可以爲我解釋。謝謝!

+2

未定義的行爲意味着任何事情都可能發生:) –

回答

6

您不允許修改const對象。修改const對象(通過非const指針)具有未定義的行爲。 UB意味着任何事情都可能發生。具有未定義的行爲是程序員的錯誤。

雖然它主要是沒有意義的推理UB,在這種情況下,觀察到的行爲可能是由於constant folding

+0

但它有相同的地址。這是我的錯,C++錯誤還是什麼? –

+0

您不得修改const對象。但你做到了。這是你的錯誤。地址是無關緊要的。 – user2079303

+2

@DungNguyen編譯器用'cout << 2'替換了'cout << a',因爲'a'是一個常量。它不必考慮'a'改變的可能性,即使你爲此而改變,因爲這樣做是明確禁止的。 「未定義行爲」表示您觀察到的差異:由於'const'合同已被破壞,所以沒有任何意義,也沒有必要。 – Quentin

2

答案是優化。更確切地說,不斷的傳播。由於a被聲明爲常量並且初始化爲2,因此編譯器在調用operator<<(ostream&, int)時會簡單地對代碼2進行硬編碼,因爲它會導致比再次讀取a的內容更快的代碼。

而且它是合法的:由於您調用了未定義的行爲,因此編譯器可以自由地執行它認爲最好的操作。

相關問題