返回信息流C++的常量(const)是安全的么?答案是否定的。嗯嗯。下面是我自己研究的一段代码。不过会出现一个很奇怪的现象,现在请问下各路的大牛。求解。。。
#include <iostream>
using namespace std;
int main(){
const int b = 10;
const int &c = b; //b的引用。
unsigned d = (unsigned)(&b);
int *p = (int*) d;
*p = 12;
//接下来就是奇怪的时候
if(b == c)//c是b的引用
{
cout<<"true"<<endl;
}
else
{
cout<<"false"<<endl;
}
cout<<"b:"<<b<<",c:"<<c<<endl;
cout<<"根据b的地址来取值"<<endl;
cout<<*(int *)(unsigned)(&b)<<endl;
system("pause");
return 0;
}
运行结果:
这是一条镜像帖。来源:北邮人论坛 / cpp / #75464同步于 2013/12/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++常量问题
tangzehang
2013/12/2镜像同步85 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我倒觉得不是编译器的问题。我再发另外一个代码吧。。
#include <iostream>
using namespace std;
int main(){
int bb = 10;
const int b = bb;
const int &c = b; //b的引用。
unsigned d = (unsigned)(&b);
int *p = (int*) d;
*p = 12;
//接下来就是奇怪的时候
if(b == c)//c是b的引用
{
cout<<"true"<<endl;
}
else
{
cout<<"false"<<endl;
}
cout<<"b:"<<b<<",c:"<<c<<endl;
cout<<"根据b的地址来取值"<<endl;
cout<<*(int *)(unsigned)(&b)<<endl;
system("pause");
return 0;
}
上面的代码经过一点小修改。就不出问题了。嗯嗯。我个人认为是C++对变量的存储机制吧。
【 在 bswgd 的大作中提到: 】
: 对于楼主代码中这么乱来的指针,编译器是防不胜防的。也就是出来的结果是不可预测的。
: 用vczh大神的话讲就是“编译器也是有bug的,不要随便挑战它。。。”
【 在 tangzehang 的大作中提到: 】
: 我倒觉得不是编译器的问题。我再发另外一个代码吧。。
: #include <iostream>
: using namespace std;
: ...................
这份代码算不出问题的代码?
b本来是10
后来都变成了12
这算不出问题????
。。。。。。。。。。。。
通过指针可以定向修改想要修改的内存值。这个方法可以修改常量。
b为什么变成10了?因为我读取出了b的地址,并且把修改地址内的值,
所以很当然,b变成了12。
【 在 bswgd 的大作中提到: 】
:
: 这份代码算不出问题的代码?
: b本来是10
: ...................
这个,不是那样的。
找到了点资料,
http://zhaoweizhuanshuo.blog.163.com/blog/static/1480552622010425113746205/
可以看看这个文章,我估计是符号表的“赋值”规则吧,估计是符号表的规则。
【 在 gaoweiwei 的大作中提到: 】
: 常量分两种,字面常量和不变的变量,一旦对常量取地址或引用,前者就会退化成后者
此问题甚屌。。导致我们寝室从熄灯 讨论 猜想到了现在。。。。。。。不过看汇编果然编译器新搞了一份拷贝出来。。。。只是一直猜不透的是最后取b的地址竟然还是和取c的地址结果一样。。。