Const的一些“奇闻轶事”。

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 修饰引用时,也会分配存储空间

     

 

 

原文地址:https://www.cnblogs.com/muming-hardworking/p/6859224.html