1. C语言中的const
(1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量。所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。
(2)const修饰的局部变量在栈上分配空间,全局变量在只读存储区分配空间
(3)const只在编译期有用,在运行期无用
【编程实验】C/C++中的const
#include <stdio.h> int main() { const int c = 0; //C语言中会为变量c分配内存 int* p = (int*)&c; //C++中遇到&才为c分配内存 printf("Begin... "); *p = 5; //内存中的值己被改为5. printf("c = %d ", c);//C语言会输出内存中的5. //C++中会从符号表(而不是内存)中取值 //所以为0. printf("End... "); return 0; }
2. C++中的const
(1)C++在C的基础上对const进行了优先处理,当碰见const声明时在符号表中放入常量。
(2)编译过程中若发现使用常量,则直接以符号表中的值替换。
(3)编译过程中若发现对const常量使用了extern或&操作符,则会给对应的常量分配存储空间。注意,C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
3. 对比C/C++中的const
C语言 |
C++ |
|
本质 |
只读变量 |
常量 |
分配内存 |
会分配 |
当使用&操作符对const常量取地址时分配 当const常量为全局,并且需要在其它文件中使用时会分配内存 |
4. C++中的const与宏的区别
C++中的const |
宏 |
|
定义 |
const int c = 5; |
#define c 5 |
处理方式 |
由编译器处理,编译器会进行类型检查和作用域检查 |
由预处理器处理,只是简单的文本替换 |
【编程实验】const与宏
#include <stdio.h> void f() { //宏由预编译处理,其后面的宏起作用 #define a 3 const int b = 4;//作用域仅限于f函数 } void g() { printf("a = %d ", a); //合法,只要是宏定义之后都可以使用 //printf("b = %d ", b); //非法b的作用域仅限于f函数 } int main() { const int A = 1; const int B = 2; int array[A + B] = {0};//C++中合法,因为它认为A、B都是常量。 //而C语言的const本质还是变量,数组大小只能是常量 int i = 0; for(i=0;i<(A + B); i++) { printf("array[%d] = %d ", i, array[i]); } f(); g(); return 0; }
5. 小结
(1)与C语言不同,C++中的const不是只读变量
(2)C++中的const是一个真正意义上的常量
(3)C++编译器可能会为const常量分配空间
(4)C++完全兼容C语言中的const常量的语法特性