const 关键字对于熟悉C/C++的朋友都不会陌生。下面梳理下学习过程中关于const的一些奇闻轶事!
1. const 在C中是个“冒牌货"
看如下代码:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 const int n = 10; 6 int *p = (int *)&n; 7 *p = 20; 8 printf("n = %d ", n); 9 10 return 0; 11 }
在VC6.0中运行结果:
说明:将上述代码在新的编译器(新的C标准下)如CLion下编译运行,运行结果为:
将上述代码放入.cpp文件中并进行编译运行,在VC6.0中结果为:
在CLion中运行结果为:
两者没有变化!
除去C语言中新旧标准的不同对于结果的不同,为什么在C和C++同样的代码中会有上述不同的现象?
在C++中,对于所定义的const常量,在程序运行过程中系统会创建符号表,拷贝一份const常量的值存入符号表中。
当程序中有需要用到const常量时,从所创建的符号表中查找const常量并使用。
为了进一步说明这种情况,请看如下代码:
1 #include <iostream> 2 using namespace std; 3 4 int main(int argc, char *argv[]) 5 { 6 const int a = 10; 7 int *p = (int *) &a; 8 *p = 20; 9 10 cout << "a = " << a << endl; 11 cout << "*p = " << *p << endl; 12 cout << "p = " << p << endl; 13 cout << "&a = " << &a << endl; 14 cout << "*(&a) = " << *(&a) << endl; 15 16 return 0; 17 }
运行结果为:
根据运行结果,验证了我们上面所说的。
编译过程中若发现使用常量则直接以符号表中的值替换。
如果对于上述描叙还是不太清楚,可以参考以下代码:
1 #include <iostream> 2 using namespace std; 3 4 int main(int argc, char *argv[]) 5 { // 在C++中,对于所定义的const常量,在程序运行过程中系统会创建符号表 6 int b = 10; 7 cout << "b: " << b << endl; 8 cout << "*(&b): " << b << endl; 9 10 const int c = 20; 11 int *pp = (int *)&c; 12 *pp = 1000; 13 cout << "c: " << c << endl; 14 cout << "*(&c): " << *(&c) << endl; 15 16 return 0; 17 }
运行结果为:
b: 10
*(&b): 10
c: 20
*(&c): 1000
-------------------我是美腻的分割线-------------------
结论:
C语言中的const常量
C语言中的const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
以下两种情况会分配存储空间:
当const常量为全局,并且需要在其它文件中使用
当使用&操作符, 取const常量的地址
当 cosnt int &a = 10; const 修饰引用时,也会分配存储空间