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

【求助】const_cast强制类型转换,相同地址,不同值?

superbupt
2014/11/6镜像同步13 回复
rt,贴一下代码和运行结果 #include<iostream> using std::cout; using std::endl; int main() { const int x1 = 10; int *p1 = (int *)&x1; *p1 = 20; cout << "x1 = " << x1 << "\t x1_address: \t" << &x1 << endl << "p1 = " << *p1 << "\t p1_pointer:\t" << p1 << endl << endl; const int x2 = 10; int *p2 = const_cast<int*>(&x2); *p2 = 20; cout << "x2 = " << x2 << "\t x2_address: \t" << &x2 << endl << "p2 = " << *p2 << "\t p2_pointer:\t" << p2 << endl << endl; return 0; } ------------------------------------------------------------------------------------ x1 = 10 x1_address: 003CF978 p1 = 20 p1_pointer: 003CF978 x2 = 10 x2_address: 003CF960 p2 = 20 p2_pointer: 003CF960 请按任意键继续. . . ------------------------------------------------------------------------------------ 两个例子,其实强制转换的效果都是相同的,不论是用(int*),还是用const_cast<int*>,都是把常量转换为非常量,问题就在于,同一地址,存储的值怎么会不一样?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
xiaoranMU机器人#1 · 2014/11/6
因为在编译的时候const int变量x1和x2已经直接替换成立即数10了
wangxiaobupt机器人#2 · 2014/11/6
问这个的还真多,我在这个版就看到过三次 不要直接看结果,手动一步步看看代码直到运行前的变化 【 在 superbupt (superbupt) 的大作中提到: 】 : rt,贴一下代码和运行结果 : #include<iostream> : using std::cout; : ...................
superbupt机器人#3 · 2014/11/6
最近在看C++ Primer,然后不知道怎么百度,就看到博客里面的这个问题。 目前查到的解释是“常量折叠”、和编译器优化相关,现在试着看反汇编的代码。 猜猜下面代码的输出,嘿嘿,班门弄斧一下,还望指点 const int x1 = 10; const int *cp1 = &x1; int *p1 = (int *)&x1; *p1 = 20; const int *cp2 = &x1; cout << "x1 = " << x1 << "\t\tx1_address: \t" << &x1 << endl; cout << "*(&x1) = " << *(&x1) << endl; cout << "*cp1 = " << *cp1 << "\tcp1_point:\t" << cp1 << endl; cout << "p1 = " << *p1 << "\t\tp1_pointer:\t" << p1 << endl; cout << "*cp2 = " << *cp2 << "\tcp2_point:\t" << cp2 << endl << endl; 【 在 wangxiaobupt 的大作中提到: 】 : 问这个的还真多,我在这个版就看到过三次 : 不要直接看结果,手动一步步看看代码直到运行前的变化 : : ...................
superbupt机器人#4 · 2014/11/6
嗯,谢谢!希望能够再详细一点。。。 您的解释,类似于“把x1,x2存放在符号表,而不是放在内存里之类的说法”,那地址从何而来? 【 在 xiaoranMU 的大作中提到: 】 : 因为在编译的时候const int变量x1和x2已经直接替换成立即数10了
xiaoranMU机器人#5 · 2014/11/7
【 在 superbupt 的大作中提到: 】 : 嗯,谢谢!希望能够再详细一点。。。 : 您的解释,类似于“把x1,x2存放在符号表,而不是放在内存里之类的说法”,那地址从何而来? 编译器把用到x1,x2的值的地方,直接替换成10了。但是你去取x1,x2的地址的时候还是和普通代码一样啊,这个编译器优化不了的。
byr200915机器人#6 · 2014/11/7
好好看书
gsl2011机器人#7 · 2014/11/7
常量折叠 来自「北邮人论坛手机版」
gaoweiwei机器人#8 · 2014/11/7
每隔一段时间这个问题就会被拿出来问,lz可以搜下版上的帖子,应该有你需要的答案
gdl机器人#9 · 2014/11/7
看汇编,什么问题自己都能解决。