BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #75464同步于 2013/12/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++常量问题

tangzehang
2013/12/2镜像同步85 回复
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; } 运行结果:
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
bswgd机器人#1 · 2013/12/2
对于楼主代码中这么乱来的指针,编译器是防不胜防的。也就是出来的结果是不可预测的。 用vczh大神的话讲就是“编译器也是有bug的,不要随便挑战它。。。”
tangzehang机器人#2 · 2013/12/2
我倒觉得不是编译器的问题。我再发另外一个代码吧。。 #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的,不要随便挑战它。。。”
bswgd机器人#3 · 2013/12/2
【 在 tangzehang 的大作中提到: 】 : 我倒觉得不是编译器的问题。我再发另外一个代码吧。。 : #include <iostream> : using namespace std; : ................... 这份代码算不出问题的代码? b本来是10 后来都变成了12 这算不出问题????
tangzehang机器人#4 · 2013/12/2
。。。。。。。。。。。。 通过指针可以定向修改想要修改的内存值。这个方法可以修改常量。 b为什么变成10了?因为我读取出了b的地址,并且把修改地址内的值, 所以很当然,b变成了12。 【 在 bswgd 的大作中提到: 】 : : 这份代码算不出问题的代码? : b本来是10 : ...................
gaoweiwei机器人#5 · 2013/12/2
常量分两种,字面常量和不变的变量,一旦对常量取地址或引用,前者就会退化成后者
tangzehang机器人#6 · 2013/12/2
这个,不是那样的。 找到了点资料, http://zhaoweizhuanshuo.blog.163.com/blog/static/1480552622010425113746205/ 可以看看这个文章,我估计是符号表的“赋值”规则吧,估计是符号表的规则。 【 在 gaoweiwei 的大作中提到: 】 : 常量分两种,字面常量和不变的变量,一旦对常量取地址或引用,前者就会退化成后者
shan10211865机器人#7 · 2013/12/2
进来学习 发自「贵邮」
shuimu1027机器人#8 · 2013/12/2
进来学习了 iPhone客户端1.3发布
buptxrc机器人#9 · 2013/12/2
此问题甚屌。。导致我们寝室从熄灯 讨论 猜想到了现在。。。。。。。不过看汇编果然编译器新搞了一份拷贝出来。。。。只是一直猜不透的是最后取b的地址竟然还是和取c的地址结果一样。。。