【从 C 向 C++ 进阶】- 对 C 的语法扩展 - const 关键字

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值