读书人

【C++】const的离怪事件

发布时间: 2012-09-25 09:55:59 作者: rapoo

【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哈哈,非常感谢,那篇博客的提问就是我问的。。。

读书人网 >C++

热点推荐