zoukankan      html  css  js  c++  java
  • C与C++中的const

    同样,有下面一段代码:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     const int i = 0; 
     7     int *j = (int *) &i; 
     8     *j = 1; 
     9     cout<<"i address = 0x"<<hex<<&i<<","<<"j address = 0x"<<hex<<j<<endl;
    10     cout<<"i value = "<<i<<","<<"j value = "<<*j<<endl;
    11     system("pause");
    12     return 0;
    13 }

    我们在C++编译器中运行如下:

    我们发现const关键字严格遵守了其关于常量的定义。然而疑问出来了

    为什么相同的地址会输出不同的值。

    同样的代码我们放入C编译器中运行会发现输出结果:

    i value = 1,j value =1

    这是为什么呢?

    以下是我自己的一点理解:

    1.C语言中const为不可改变的变量,其实质仍然是变量,仍然会在编译期间分配内存

       那么我们可以获取该内存并修改该内存处的值。这样虽然不允许直接对const 变量修改

       但是间接修改该内存位置的值达到修改该变量的效果。

    2.C++中const关键字定义的是常量类型,在编译的期间直接确定了其值,比如我们

       可进行如下操作在C++中 编译是可以通过的

    1 const int size=5;
    2 int array[size];

        表明在编译的时候size是已经确定了。然而这种情况在C语言的情况下是绝对不可以编译通过的,

        其实我猜,当我们在c++中定义一个const类型的变量的时候,编译器也是要为其分配内存的,

        只不过在编译阶段遇到时候直接替换,在运行的时候,该常量的值是直接存在某个寄存器中,这样

        运行代码中需要用到该值时直接可从寄存器中索取,而非在内存中索取。

    那么,我们可以作这样一种测试,我们把const前面加上volatile关键字防止编译器直接从寄存器中取 

    常量值,而是从内存中取,代码如下:

    我们发现此时,const类型变量i的值是已经被改变了,则证明我猜想的思路也许是对的,又或许编译器

    用了更复杂的方式处理,但是大概思路应该是这样吧

    最后我们总结下:

    前面说了那么多无非有以下两点:

    1.C C++中的const变量是都要分配内存的。

    2.C++只不过在编译的时候直接进行变量替换,同时在运行过程中直接在寄存器中取const变量的

       值,这是C++编译器优化的结果。

    3.而对于C语言而言每次const使用都是直接从内存中取值,这样每次const变量的间接改变都能得到

       反映。

    如果你有更好的理解欢迎一起讨论或者分享。

  • 相关阅读:
    微信小程序,本地和真机测试都是好的,但体验版扫码显示空白页
    redis cluster 集群从节点无法读取值 (error) MOVED 原因和解决方案
    mysql笔记
    微信小程序对接通联支付
    解决win7凭据重启后消失的问题
    友链
    第三方登录--QQ登录--单体应用
    【笔记-错误】springCloud-alibaba-feign集成sentinel的启动报错
    【笔记】 springCloud--Alibaba--服务注册和服务发现
    【笔记】springCloud--Alibaba--nacos介绍----启动报错解决方案
  • 原文地址:https://www.cnblogs.com/vpoet/p/4771805.html
Copyright © 2011-2022 走看看