考慮下面的代碼片段:獲取甚至通過const_cast會改變之後的常量變量的值相同
int main()
{
const int i=3;
int *ptr;
ptr=const_cast<int*>(&i);
*ptr=5;
cout<<"i= "<<i<<endl; <------------------- statement 1
cout<<"*ptr= "<<*ptr<<endl; <------------- statement 2
return 0;
}
我得到的輸出:
i= 3
*ptr= 5
爲什麼是不是通過指針改變了i
的值?
我知道拋棄顯式聲明爲const的變量的常量,並將其值修改爲'未定義行爲'。我很想知道:是否有編譯器優化機制,「編譯器用值'替換程序中的變量? 這意味着該語句1是由編譯器解釋爲:
cout<<"i= "<<3<<endl;
即使聲明
ptr=const_cast<int*>(&i);
由
ptr=(int*)(&i);
我收到相同的輸出代替:http://ideone.com/5lzJA
如果你想知道編譯器做了什麼,只要看看編譯器做了什麼(即生成的代碼)。 – 2012-07-27 15:21:07
我認爲downvotes是苛刻的 – James 2012-07-27 15:33:23
優化通常被稱爲「不斷傳播」。只要可觀察的行爲是正確的,編譯器就可以做任何事情。行爲是未定義的,所以編譯器會自動修正它所做的任何事情。 – Flexo 2012-07-27 15:42:35