zoukankan      html  css  js  c++  java
  • 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 修饰引用时,也会分配存储空间

         

     

     

  • 相关阅读:
    python的模块future用法实例解析
    strcmp函数和memcmp函数的用法区别及联系
    esp8266 smartconfig-智能配网分析和使用及注意事项
    ubuntu 18.04 安装并配置adb
    Markdown的常用方法总结
    mac下使用minicom几个注意事项
    最强Linux shell工具Oh My Zsh 指南
    ESP8266源码分析--打印的基本用法
    atom 在Ubuntu 18.04 上安装及基本使用
    ubuntu 查看端口被占用并删除端口
  • 原文地址:https://www.cnblogs.com/muming-hardworking/p/6859224.html
Copyright © 2011-2022 走看看