Const的一些“奇闻轶事”。

阅读: 评论:0

Const的一些“奇闻轶事”。

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

     

 

 

 

 

 

转载于:.html

本文发布于:2024-01-29 14:29:20,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170650976415932.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:轶事   奇闻   Const
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23