返回信息流#include<iostream>
using namespace std;
int main()
{
const int a = 1;
int *p = const_cast<int*>(&a);
*p = 2;
cout << "value a="<< a << endl;
cout << "value *p=" <<*p << endl;
cout << "address a=" <<&a << endl;
cout << "address p=" <<p << endl;
return 0;
}
结果
这是一条镜像帖。来源:北邮人论坛 / cpp / #80686同步于 2014/7/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
谁能给解释一下这个好玩的例子
mogumogu
2014/7/5镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
确实可以通过指针来改变const变量在内存中实际的值,但const从逻辑上是定义的不变,那么要怎样才能在能改变的情况下,保证值是不变的呢?编译器在处理cout << "value a="<< a << endl; 这句的时候,为了逻辑上保证不变,直接cout << "value a="<< 1<< endl; 这样处理了。
编译器这么机智么...
预处理的时候好像没有做修改,在执行的过程中不该从地址取值么
【 在 gdl 的大作中提到: 】
: 确实可以通过指针来改变const变量在内存中实际的值,但const从逻辑上是定义的不变,那么要怎样才能在能改变的情况下,保证值是不变的呢?编译器在处理cout << "value a="<< a << endl; 这句的时候,为了逻辑上保证不变,直接cout << "value a="<< 1<< endl; 这样处理了。
预处理是处理头文件,宏定义之类的,这个必然没被处理。你要是还不明白,直接看链接后程序的汇编码吧,a的值直接是push 1。编译器也有好坏,g++那是相当不错的,很好的支持了c++标准。
【 在 mogumogu 的大作中提到: 】
: 编译器这么机智么...
: 预处理的时候好像没有做修改,在执行的过程中不该从地址取值么
:
这是因为编译器已经默默的为你做了一下事情。
const int a = 1;
这个在编译器看来,a 就是一个常数。也就是不会被改变,也就是有a的地方它会认为一直等于1;就相当于 #define a 1 。
不过你使用其他的手段强行改变了 a 地址内存的值。但是a看起来还是原来那个样子,所以出现a的地方,它就会用1来代替。自然就不是你所希望的值了。
【 在 mogumogu 的大作中提到: 】
: [code=c]
: #include<iostream>
: using namespace std;
: ...................
怎么看到这个链接结果的
【 在 Anti2005 的大作中提到: 】
: 这是因为编译器已经默默的为你做了一下事情。
: const int a = 1;
: 这个在编译器看来,a 就是一个常数。也就是不会被改变,也就是有a的地方它会认为一直等于1;就相当于 #define a 1 。
: ...................