const 常量_第3课-进化后的const分析

一、C语言中的const

(1) const修饰的变量是只读的,本质还是变量;

(2) const修饰的局部变量在栈上分配空间;

(3) const修饰的全局变量在只读存储区分配空间;

(4) const只在编译期有用,在运行期无用;

(5) const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边;例如可 以通过指针修改该变量的值。

(6) const将具有全局生命周期的变量存储于只读存储区。const不能定义真正意义上的常量。

(7) c语言的常量只有用enum定义的。

下面两图就很好的展示了上面几点:图1是代码,图2是图1的执行结果。

4eff24eeaaec933b0baaa298b2d5756d.png

图1

bcfd1650ee126ea4c3ed430cf599fb48.png

图2

二、C++中的const

(1) 当const声明变量时,将会在符号表中放入常量的值;

(2) 编译过程中若发现使用常量时,则直接用符号表中的值替换;

(3) 编译过程中若发现下述情况则会给对应的常量分配存储空间;

对const常量使用了extern;

对const常量使用&操作符;

(4) C++编译器虽然可能为const常量分配空间,但不会使用该空间中的值。如下图所示:

e355323344710458807d1c0d1ecf7c7f.png

图3

从图3中可看出在编译时,会把c的值0存入符号表,在后面打印c的值就用符号表中的值替换c。

三、C++中的const与宏

(1) C++中的const常量类似于宏定义;

例如const int c=5;类似于#define c 5;

(2) const常量是由编译器处理的,编译器对const常量进行了类型检查和作用域检查;

(3) 宏定义则由预处理处理,单纯的文本替换。

下图将会解释以上几点

33033879f8c5ac36f2376f8717be77fe.png

图4

图4的代码若用C语言编译器将会报错,因为19行中的A和B是变量不是确定的值,所以报错。如图5所示:

a58d874e9a6def5c91be67e889cd7cfd.png

图5

图4的代码若用C++语言编译器则运行正常,因为A和B是常量了,而g()函数中a则用在f()中的宏定义替换。如图6所示;如果g()中的第12行去掉注释则编译就会报错,因为f()中的const int a =4;只在f()中起作用。如图7所示。

f4ef53be1c2039d211c150866be39d4d.png

图6

6050fd01f39ffc24f2a1077254f71281.png

图7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值