i的值如何没变化
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;这种未定义行为是没有标准做法的。所以,它不安全。