一个奇怪的强制类型转换问题
下面程序指针p和引用b都指向a,改变*p后,不知道为什么*p,b改变了,而a没变?
int main()
{const int a=5;
int *p=(int *)&a;
const int &b=a;
cout < < "a= " < <a < < "\t&a= " < <&a < <endl
< < "b= " < <b < < "\t&b= " < <&b < <endl
< < "*p= " < <*p < < "\tp= " < <p < <endl < <endl;
*p=10;
cout < < "a= " < <a < < "\t&a= " < <&a < <endl
< < "b= " < <b < < "\t&b= " < <&b < <endl
< < "*p= " < <*p < < "\tp= " < <p < <endl < <endl;
return 0;
}
结果为:
a=5 &a=0x22ff74
b=5 &b=0x22ff74
*p=5 p=0x22ff74
a=5 &a=0x22ff74
b=10 &b=0x22ff74
*p=10 p=0x22ff74
[解决办法]
常量本来是不会分配内存空间的,当你对他进行取地址的时候才会分配一个空间,但取a的值的时候是直接用数字代替的,就像define 的宏一样,如果你从来没有进行取地址的操作(指针或者引用)编译器不会为它分配空间
[解决办法]
/**
*test1_2.cpp
* 测试CSDN 'S http://community.csdn.net/Expert/topic/5326/5326445.xml?temp=.6901972
* 参考:The C++ Programming Lanuage(Special Edition), Bjarne Strustoup.P117
*Enviroment: Win xp sp2 + Dev-C++4.9.2.2
*/
#include <iostream>
using namespace std;
int main(void)
{
const int a = 5;
int *p = (int *)&a; //编译通过,危险,强制不相关类型转换
/*
//以下无法编译通过, static_cast进行相关类型转换检查
//invalid static_cast
//from type `const int* ' to type `int* '
int *q = static_cast <int *> (&a);
*/
/*
//以下无法编译通过,reinterpret_cast进行比较小的相关类型转换检查
//reinterpret_cast
//from type `const int* ' to type `int* ' casts away constness
//int *r = reinterpret_cast <int *> (&a);
const int &b = a;
*/
cout < < "a= " < <a < < "\t&a= " < <&a < <endl < <
"b= " < <b < < "\t&b= " < <&b < <endl < <
"*p= " < <*p < < "\tp= " < <p < <endl < <endl;
*p=10;
cout < < "a= " < <a < < "\t&a= " < <&a < <endl < <
"b= " < <b < < "\t&b= " < <&b < <endl < <
"*p= " < <*p < < "\tp= " < <p < <endl < <endl;
system( "PAUSE ");
return 0;
}
[解决办法]
我翻阅好几本书,也查了标准文档,反正我没有找到跟你说的一模一样的。
程序语言嘛,你看看名家写的书,只是提到这类问题很危险,请谨慎使用,并且很多情况我们根本必要去违反这样的原则。
请问你会用到将const指针强制转换为非const指针吗?你这样做有现实意义吗?
还有很多事情如果不按照标准建议,那么你的结果将会使很离奇的,例如你非要将一个指向局部变量的指针或者他的引用作为返回值返回,那你的结果自然很离奇。
如果你要你没有制定数组长度(越界了或者找不到字符串结束符了),编译器也不会给你错误,运行的时候也不见得一定会出现异常终止(如果你运气总是那么好)。
学等西,不必要去咱牛角尖,如果你想搞清楚这个问题,我想最好去问设计这个编译器的人,问问他某人情况下是怎样处理这种情况的,他会说:兄弟,还是正规正距的吧。
[解决办法]
我在去年5月5日,于http://community.csdn.net/Expert/topic/4731/4731765.xml?temp=.3522913发过这样的帖。
引起此问题的原因是优化编译造成的,如果去掉优化编译,结果应该是相同的。
优化编译的时候,编译器发现了const int a =5;所以编译器就理所当然的认为a的值都是5了,因此为了提升运行速度,编译器把后面出现的[a值]全部直接替换成了5。
像 cout < < "a= " < <a < < "\t&a= " < <&a < <endl;就被优化理解为 cout < < "a= " < <5 < < "\t&a= " < <&a < <endl;这个了。