关于const变量的一点理解

无意间看到一题目 是关于const变量的。代如下

 

 问题是:

pCInt = &LENGTH,

然而后面的输出是1 2

为什么?

 

一步一步分析,const int *pCInt = & LENGTH;

pCInt 为指向LENGTH地址的值,且为常量。

(int) *pCInt = 2; 实际上等同 const_cast<int>(*pCInt) = 2;

去掉变量的常量属性再赋值。也就是改变了 pCInt 指向的地址的值为2.

即然值为2,那么LENGTH中内存的值也为2,为什么会输出1呢?是不是编译器做了

什么处理?(我当时给出的回答就是编译器做出了处理,具体是什么不清楚)

后来仔细想了下,可能是符号替换,不知道对不。

 

下面用汇编代码来验证我们的想法。

(为了看得清楚,把cout改成printf了) 

 

从printf("%d/n",LENGTH);

00401056  push        1   

可以看出,编译器是做的符号替换,就是在编译的时候遇到LENGHT直接替换为1

 

printf("%d/n",*pCInt);

00401065  mov         eax,dword ptr [pCInt] 

00401068  mov         ecx,dword ptr [eax] 

 

遇到*pCInt是直接从内存中去取值。

 

 

总结如下:

 1.变量本身的类型最好不要去改变,除非必要。

 2.要明确cosnt的意义,什么时候该用,什么时候不该用,这是基本功。

 3.理解符号替换,就相当于宏定义

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章