#include <stdio.h>
int main()
{
const int a = 2;
int* p = (int*)&a;
*p = 5;
printf("%d\n", a);
return 0;
}
C编译后的结果:
gcc -o const.exe const.c
C++编译后的结果
g++ -o const.exe const.c
我们不能直接修改const变量的值,但是可以试图通过指针这个工具,骗过编译器的语法检查,最终能否修改到const变量的值呢?
这里就要先解释一下,什么才叫真正意义上的常量, 在内存空间中,确实是有一块常量存储区专门保存常量值的,操作系统也会对该区域进行管理,不允许程序做任何修改。那怎样的变量会落入这块区域呢?只有代码中的字面量,才会成为常量存入这块区域内,那也就是说,真正意义上的常量,只能是硬编码写死的那些字面量了!
如此一来,C++编译器到底是如何将const变量变成真正意义上的常量呢?那么只有一种可能,就是转化为字面量了!到底是不是这样呢?
我们再来看一个现象:
#include <stdio.h>
int main()
{
const int max = 10;
int attr[max] = {0};
return 0;
}
g++ -o const.exe const.c
无错
可以发现C认为const变量仍然是变量,因此不能初始化数组大小,而C++ 则会将其转为字面量,因此可以初始化数组大小了。
C++ 在编译const的时候,会生成一个常量表,专门用于记录常量,在往下编译的过程中,发现使用变量的地方恰好在常量表里面有定义,会将const变量改为字面量,从而成为真正意义上的常量了!