首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求教啊关于const,该怎么处理

2013-11-04 
求教啊,关于const#include iostreamusing namespace stdint main(){const int a 1int b 2int *p

求教啊,关于const

#include <iostream>
using namespace std;

int main()
{
const int a = 1;
int b = 2;
int *p = &b;
*(p + 3) = 3;

cout<<(unsigned)&a - (unsigned)&b<<endl;
cout<<a<<" "<<&a<<"  "<<p + 3<< "  " << *(p + 3)<<endl;


return 0;
}

以上代码用VS2012编译结果为:
12
1 0103FCC8  0103FCC8  3
请按任意键继续. . .

为什么是12,为什么a没变3...

#include <iostream>
using namespace std;

int main()
{
const int a = 1;
int b = 2;
int *p = &b;
   *(p - 1) = 3;
   
   cout<<(unsigned)&b - (unsigned)&a <<endl;
cout<<a<<" "<<&a<<"  "<<p - 1<< "  " << *(p - 1)<<endl;
return 0; 
}



用c-free 编译结果是这样的

4
1 0x23ff38  0x23ff38  3
请按任意键继续. . .

a还是没变3啊。。

求解
[解决办法]
 
a被常量表达式初始化就成了一个编译期常量.
如果你对a没有取地址操作,编译器会做优化,不会为a划分内存,划分内存也仅仅是为了满足&a.
里面的值会被初始化为i的值.但是在程序上,名字i表示的是原先的值,而不是内存里的值.
(盗用了一位前辈的话)
也就是所谓的常量重叠了!
[解决办法]
是当做立即数了,编译器直接把取a值的部分用常量替换了。
引用:
Quote: 引用:

 
a被常量表达式初始化就成了一个编译期常量.
如果你对a没有取地址操作,编译器会做优化,不会为a划分内存,划分内存也仅仅是为了满足&a.
里面的值会被初始化为i的值.但是在程序上,名字i表示的是原先的值,而不是内存里的值.
(盗用了一位前辈的话)
也就是所谓的常量重叠了!


是编译器把他当作立即数了吗

热点排行