求教啊关于const,该怎么处理
求教啊,关于const
以上代码用VS2012编译结果为:
12
1 0103FCC8 0103FCC8 3
请按任意键继续. . .
为什么是12,为什么a没变3...
用c-free 编译结果是这样的
4
1 0x23ff38 0x23ff38 3
请按任意键继续. . .
a还是没变3啊。。
求解
------解决方案--------------------
a被常量表达式初始化就成了一个编译期常量.
如果你对a没有取地址操作,编译器会做优化,不会为a划分内存,划分内存也仅仅是为了满足&a.
里面的值会被初始化为i的值.但是在程序上,名字i表示的是原先的值,而不是内存里的值.
(盗用了一位前辈的话)
也就是所谓的常量重叠了!
------解决方案--------------------
是当做立即数了,编译器直接把取a值的部分用常量替换了。
#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值的部分用常量替换了。