首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

i的值如何没变化

2012-04-22 
i的值怎么没变化C/C++ code]#include iostreamusing namespace stdint main(){ const int i10 int *p

i的值怎么没变化

C/C++ code
]#include <iostream>using namespace std;int main(){ const int i=10; int *p=(int*)&i; *p=100; cout<<i<<endl;}


[解决办法]
尝试修改常量是未定义行为的.

google 未定义行为
[解决办法]
楼上说的是对的。
但楼主想问的应该是为什么i的值没改变,实际上是改变了的。
搜索const常量折叠。
cout<<i<<endl;这个地方实际上使用的是一个恒定的值,因为编译器认为const变量不会被改变。

http://wenku.baidu.com/view/5b808621af45b307e87197ec.html
[解决办法]
1.google"常量折叠"
2.如果不想有这种优化那么用 const volatile int i=10;
[解决办法]
一般情况下编译器并不会真的为i分配一个存储空间。因为那只是一个量,而且永远不会变化,没必要给它存储空间。

那么当你执行int *p=(int*)&i;时候会发生什么呢?这个就要看各个编译器的具体实现方式了。其中一种方式就是:分配一个存储空间,在里面放上i的值,然后把该空间地址作为&i的返回值传递给p。

这个是真的有存储空间了,而且不在只读区,所以你能改变它。但它只是初值被赋为了i的值,并非真的就是i自身了。i自身还是那个连存储空间都没有的常量值,当你取i值的时候编译器才不会去管你对*p做了什么,直接就把那个常量值给你了。

int *p=(int*)&i;这种未定义行为是没有标准做法的。所以,它不安全。

热点排行