一、C语言中的const
(1) const修饰的变量是只读的,本质还是变量;
(2) const修饰的局部变量在栈上分配空间;
(3) const修饰的全局变量在只读存储区分配空间;
(4) const只在编译期有用,在运行期无用;
(5) const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边;例如可 以通过指针修改该变量的值。
(6) const将具有全局生命周期的变量存储于只读存储区。const不能定义真正意义上的常量。
(7) c语言的常量只有用enum定义的。
下面两图就很好的展示了上面几点:图1是代码,图2是图1的执行结果。
![4eff24eeaaec933b0baaa298b2d5756d.png](https://i-blog.csdnimg.cn/blog_migrate/3185dac914baee550d03ddc710e45542.jpeg)
图1
![bcfd1650ee126ea4c3ed430cf599fb48.png](https://i-blog.csdnimg.cn/blog_migrate/9ac3e65acf35e46ff52b59663732e96e.jpeg)
图2
二、C++中的const
(1) 当const声明变量时,将会在符号表中放入常量的值;
(2) 编译过程中若发现使用常量时,则直接用符号表中的值替换;
(3) 编译过程中若发现下述情况则会给对应的常量分配存储空间;
对const常量使用了extern;
对const常量使用&操作符;
(4) C++编译器虽然可能为const常量分配空间,但不会使用该空间中的值。如下图所示:
![e355323344710458807d1c0d1ecf7c7f.png](https://i-blog.csdnimg.cn/blog_migrate/61450292e8412ff2ff24e5d94ac550a9.jpeg)
图3
从图3中可看出在编译时,会把c的值0存入符号表,在后面打印c的值就用符号表中的值替换c。
三、C++中的const与宏
(1) C++中的const常量类似于宏定义;
例如const int c=5;类似于#define c 5;
(2) const常量是由编译器处理的,编译器对const常量进行了类型检查和作用域检查;
(3) 宏定义则由预处理处理,单纯的文本替换。
下图将会解释以上几点
![33033879f8c5ac36f2376f8717be77fe.png](https://i-blog.csdnimg.cn/blog_migrate/b435a928125044ccea87eabf5496233e.jpeg)
图4
图4的代码若用C语言编译器将会报错,因为19行中的A和B是变量不是确定的值,所以报错。如图5所示:
![a58d874e9a6def5c91be67e889cd7cfd.png](https://i-blog.csdnimg.cn/blog_migrate/61dca54ed358f3ab732669a542e97d26.jpeg)
图5
图4的代码若用C++语言编译器则运行正常,因为A和B是常量了,而g()函数中a则用在f()中的宏定义替换。如图6所示;如果g()中的第12行去掉注释则编译就会报错,因为f()中的const int a =4;只在f()中起作用。如图7所示。
![f4ef53be1c2039d211c150866be39d4d.png](https://i-blog.csdnimg.cn/blog_migrate/85624d19d6005f9609d7cd75a5155ab9.jpeg)
图6
![6050fd01f39ffc24f2a1077254f71281.png](https://i-blog.csdnimg.cn/blog_migrate/9fcd258e316efc4e9d8a5d6bb5cb55b5.jpeg)
图7