c++中定数折りたたみ


環境:VC 6コード1:

   
int main() { const int i=2 ; int* p=(int*)(& i); *p=100 ; cout<<"i : "<<i<< endl; cout<<""<<*p<< endl; cout<<""<<p<< endl; cout<<"i : "<<&i<< endl; return 0 ; }

結果:2 100 0012 FF 7 C 0012 FF 7 C----------------------------------------------------コード2:

   
int main() { const int& i=2; // int* p=(int*)(& i); *p=100 ; cout<<"i : "<<i<< endl; cout<<""<<*p<< endl; cout<<""<<p<< endl; cout<<"i : "<<&i<< endl; return 0 ; }

結果:100,100,0012 FF 7 C 0012 FF 7 C----------------------------------------------コード3:

   
int main() { int a=2; // const int i=a; // a int* p=(int*)(& i); *p=100 ; cout<<"i : "<<i<< endl; cout<<""<<*p<< endl; cout<<""<<p<< endl; cout<<"i : "<<&i<< endl; return 0 ; }

結果:100 100 0012 FF 7 C 0012 FF 7 C-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------変えることはできない、しかしどうして*pはまた100を出力することができますか?100はどこにあるの?2段目のコードに引用を加えると、なぜiの値を変更できるのですか?いったい何があったの?
=================================================================================
定数折り畳み:int main(int argc,char*argv[]){const int i=0;int*j=(int*)&i;*j=1;cout<&i<第2段は本質的に第3段と同じであるべきだ.2番目のセグメントでは、コンパイラが場所を探して2を保存し、匿名変数に相当します.