[quote=引用 19 楼 Ghjhfssfgk的回复:][quote=引用 16 楼 C_ElecM的回复:]这应该不是编译器优化了,而是本来就这样,对一个变量进行const申明或定义,那么这个变量就会被编译器放在只读代码段,地址和内容都固定(化)了。如果我们需要去改变一个变量的值时,我们就不该将变量修饰为const,不然就是“自己挖坑自己填”,所以所有的问题就是在开头就已经不符合初衷了。
[quote=引用 16 楼 C_ElecM的回复:]这应该不是编译器优化了,而是本来就这样,对一个变量进行const申明或定义,那么这个变量就会被编译器放在只读代码段,地址和内容都固定(化)了。如果我们需要去改变一个变量的值时,我们就不该将变量修饰为const,不然就是“自己挖坑自己填”,所以所有的问题就是在开头就已经不符合初衷了。
这应该不是编译器优化了,而是本来就这样,对一个变量进行const申明或定义,那么这个变量就会被编译器放在只读代码段,地址和内容都固定(化)了。如果我们需要去改变一个变量的值时,我们就不该将变量修饰为const,不然就是“自己挖坑自己填”,所以所有的问题就是在开头就已经不符合初衷了。
int const x=12; const int y=12; int* p=(int*) &x; *p=5; cout<<x<<endl; cout<<*p<<endl; cout<<&x<<endl; cout<<p<<endl; 输出结果如下: 12 5 0xa58ca2e0 0xa58ca2e0 为什么会这样,到底是(int*)做了什么,还是const出问题了。
你用volatile修饰一下x,让他从内存读 volatile const int x; 最后输出出来就是5了
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
因为编译器进行优化了,直接从寄存器读取了,没从内存
你这两个变量是定义在局部变量吗?你把它定义为全局变量试试~
可能是编译器优化了常量 你在变量x定义前面加个volatile关键字看看
因为x是const修饰的,所以输出x的值时,编译器并没有生成代码去读x的值,而是直接输出了12,至于你是否通过指针修改了x它并不考虑。 另外,*p=5;这行能否正常执行,还是出现异常,是实现依赖的,使用不同编译器可能有不同的结果。
64,513
社区成员
250,634
社区内容
加载中
试试用AI创作助手写篇文章吧