1. const 关键字
在 C 中,const 关键字可以改变变量的属性以及存储空间。不同的判别标准如下:
- 修饰局部变量:变量具有只读属性,仍保存在内存的栈中,可通过指针访问地址进行修改。
- 修饰全局变量或静态变量:变量存储空间由静态存储区改变为只读存储区(.rodate段),且不能用指针来修改。
在 C++ 中,对 const 关键字的作用进行了优化。编译器编译过程中遇到 const 修饰的标识符时,会将 const 修饰的标识符放入符号表中。如果后续编译过程中发现 const 修饰的标识符时,直接使用符号表中 const 修饰的标识符对应的值直接替换。
- 示例:
int main(void)
{
const int var_con = 3;
int arr[var_con] = {
0}; // 等价于 int arr[3] = {0};
}
以上在 C++ 是合法的,但在 C 中会发生编译错误,因为在 C 中只读变量不能作为左值。
2. C++ 的 const 常量
const 常量的规则如下:
- 用字面量初始化的 const 常量会进入符号表,因为在编译期间常量值已确定。
- 用已存在的变量初始化的 const 常量仍为只读变量,因为在编译期间常量值无法确定。
- 被 volatile 修饰的 const 常量不会进入符号表。
C++ 想是把 const 修饰的变量从 C 中的只读变量优化为真正意义上的常量,但为了兼容 C 语言的做法,在以下情况下,编译器会给 const 常量分配空间:
- const 常量为全局(extern 修饰),并且需要在其它文件中使用。
- 使用 & 操作符对 cosnt 常量取地址。
虽然编译器对 const 常量分配了空间,但如果 const 常量进入了符号表的话,修改了内存空间的内容时也无法更变 const 常量值。
- 实验
int main()