普通const变量在C++中为不可修改的;但是只是在编译器编译的过程中会有提示;
通过地址间接进行修改const的值会怎样?
const long i1 = 5;
long i2 = 10;
long i3 = 20;
long *i4 = &i2;
i4 = i4 - 8;
*i4 = 9;
这样改,编译器会报错吗?
不会。编译器编译通过,并且能正常跑。
那么,问题来了,i1的值会变成9吗?来cout一下:
std::cout << i1 << ", " << &i1 << std::endl;
std::cout << i2 << ", " << &i2 << std::endl;
std::cout << i3 << ", " << &i3 << std::endl;
std::cout << *i4 << ", " << i4 << std::endl;
要不就是i1更改失败,i1 == *i4 == 5,要不就是i1更改成功,i1 == i4 == 9?
并不是:
那么,为什么,i1的值没变,但是i4的值变了呢???去看一眼VS的优化选项:
已经禁用优化了啊?
原因到底在哪里呢???
再看一下反汇编代码:
在std::cout<<i1的时候,直接用常量数字5写进代码了。
这叫没有优化=.=
写完发现有C语言中const变量修改以及优化问题已经说明过了,可以加volatile让编译器强行去内在取值。
所以const只是依赖于编译器的实现。。。