无意间看到一题目 是关于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.理解符号替换,就相当于宏定义