【C++】const的离奇事件
首先看两个关于const的程序,并且猜测输出的结果是什么?
#include <iostream>using namespace std;void main(){const int a = 2;int *b = (int *)&a;*b = 3;cout << a <<endl;cout << (*b) <<endl;}
输出的是 2 和 3
#include <iostream>using namespace std;void main(){int c = 2;const int a = c;int *b = (int *)&a;*b = 3;cout << a <<endl;cout << (*b) <<endl;}
输出的是3 和 3
这是为什么呢?
- 5楼lir__昨天 23:34
- 第一感觉是int *b = (int *)&a; 报错....n没想到真输出了...
- Re: bxyill昨天 23:43
- 回复lir__n强制类型转换为何会报错呢?
- 4楼han_yankun2009昨天 23:33
- 回答的很呀
- Re: bxyill昨天 23:34
- 回复han_yankun2009nyes
- 3楼giveamail昨天 23:32
- 其实两个都是一样的道理,编译器在编译的时候,读到const判断为只读,就会把下面的所有引用以右边的代替,这样就可以消去一个变量,所以第一用2代替,第二用以c代替
- 2楼chenj0726昨天 19:56
- 第一个示例 到ubuntu下用gcc编译 会得到你要的结果。nn这是C和C++关于const实现的机制不同。C通过指针实现,所以通过指针可以隐晦的修改const。但是C++改进了该机制,是将const保存在符号表中,所以你指针指向的是const变量的一个副本,无法修改他。
- Re: bxyill昨天 23:05
- 回复chenj0726nok,thank you very much
- 1楼firendlys昨天 16:38
- 刚刚才在另一篇博客中看到,没想到又看到一模一样的代码...n懒得复制回复了,详细的回复你不妨去那篇博客看看.nhttp://blog.csdn.net/luoyeaijiao/article/details/7982385#commentsnn简单而不标准地解释一下吧:cout << a <<endl; n对于 第一段代码,实际的汇编代码是 cout<< 2 <<endl,所以输出2.n对于第二段代码,实际的汇编代码是 cout<< (*b) << endl,所以输出3
- Re: bxyill昨天 18:18
- 回复firendlysn哈哈,非常感谢,那篇博客的提问就是我问的。。。