如下代码片段中声明const变量ci并初始化为1,原则上其值是无法被修改的。但是如下的代码对const变量的内容进行了修改

int main(){const int ci = 1;int *pci = (int *)(&ci);*pci = 2;cout<<"ci =  "<<ci<<endl;cout<<"*pci = "<<*pci<<endl;return 0;
}

执行结果如下:

很诡异的结果:首先常量ci是不应该被修改的,但是却成功修改了,而且没有报错;其次是被修改后其值竟然没有变,也就是ci *pci的值竟然不同。
对于第一个问题,属于是机制问题:
因为是强制类型转换,所以编译器认定这种转换是合法的,于是就不会报错而且也去掉了对象的常量属性,那么转换后对其进行写操作也就变成了合法操作了。

第二个问题属于是编译器的优化问题:
编译器在进行优化的时候对代码进行了等价替换,将常量ci直接作为常量1进行了push .于是汇编代码和实际的C++代码是有差别的。

C++Primer第54页,56页,编译器找到所有常量ci的地方都使用1进行了替换。因为默认该值在后边是不会被修改的。如果不想让编译器直接push常量,那么可以在const前面添加volatile关键字,强制进行内存访问。强制内存访问保证了编译器不会对这种常量数据进行优化,这样内存中存储的数据与实际显示的数据就是一样的了

【C++】修改const变量的值相关推荐

  1. C++如何在const函数修改成员变量的值

    C++如何在const函数修改成员变量的值 在C++,总所周知,c++不允许在const函数直接修改成员变量的值,想要达到此目的,有两种方式: 使用mutable关键字 造一个假的this去操作成员变 ...

  2. 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

    文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...

  3. 可以修改常变量的值吗(c语言)

      c语言中,常变量是指被const关键字修饰的变量,其值一般在定义的时候初始化,之后不允许赋值改变其值.若常变量作为左值,试图对常变量赋值,编译器会报错,如以下例子. #include <st ...

  4. var和let和const_用故事讲解JavaScript的var,let和const变量

    var和let和const by Prarthana S. Sannamani 通过Prarthana S.Sannamani 用故事讲解JavaScript的var,let和const变量 (Jav ...

  5. idea修改虚拟机变量更新@author的方法

    1.idea如何修改@author变量的值 windows用户 找到idea安装目录下的bin文件夹 使用文本编辑器打开如图两个文件中任意一个 .vmoptions文件(虚拟机选项文件),在最下面加上 ...

  6. DEFCON议题解读|Dll劫持新思路——修改环境变量

    简介 在2022年的Defcon大会上,安全研究人员Wietze Beukema通过对进程级环境变量的研究,提出了一种Dll劫持新思路,下面就其中涉及的技术点展开介绍. **01 **环境变量 每一个 ...

  7. C语言const:禁止修改变量的值

    C语言const:禁止修改变量的值 有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区大小.为了满足这一要求,可以使用co ...

  8. js中Object类型和Array类型的变量被赋值(复制)给其他变量后,修改被赋值(复制)的新变量的值,会影响原始变量的值,这是为什么呢?

    JavaScript中的Object和Array都是指针变量类型,例如我声明 let obj={a:1};let arr=[1,2,3]; 其中的obj和arr存放的仅仅是对应的对象和数组内容所存放的 ...

  9. 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )

    文章目录 I . 博客总结 . 指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 1 . 讨论问题 ...

最新文章

  1. C语言字符char和整型int的关系
  2. 一行代码都不写!Github博客小白版入门教程
  3. 大马哈鱼的C#学习笔记(3):Invoke/BeginInvoke/DynamicInvoke
  4. RuntimeError: one of the variables needed for gradient computation has been modified by an inplace
  5. How to use filter in Analytics Path Framework
  6. linux能记录日志的终端,Linux上的日志系统
  7. AngularJS中页面传参方法
  8. 单链表的创建、插入、删除、倒置操作
  9. 涂抹果酱_如何玩果酱
  10. docker安装rabbitmq及简单管理
  11. OpenShift 4 - 配置本地Neuxs Registry并通过Pull Secret访问
  12. 《Android游戏开发详解》一2.2 设置开发机器
  13. Luogu2420 让我们异或吧
  14. 陶瓷天线和PCB天线以及IPEX天线三者间区别
  15. EPLAN电气设计实例入门教程pdf
  16. 挑筋(挑治)疗法——针挑治疗痔疮
  17. 闲谈寻址-DNS的多级缓存系统
  18. 从行业共生到产业共生——2021 MWC上海展观察
  19. cocos creator麻将教程系列(二)—— 达达麻将的底层通讯express框架与socketio
  20. Core Animation学习笔记—第二节Setting up Layer Objects

热门文章

  1. histeq函数实现直方图的均衡化和规定化
  2. echarts前后端交互数据_如何避免前后端在数据交互方面的相爱相杀?
  3. python整数池_【Python】Python中神奇的小整数对象池和大整数对象池
  4. python输入函数格式_python如何提取.c文件中的指定函数的输入参数
  5. 【趣图】测试刚写完的代码...
  6. 随行付微服务测试之静态代码扫描
  7. [oracle]常用SQL汇总
  8. WCF NetTcpBinding Transport安全模式(6) ClientCredentialType证书验证模式---- PeerTrust验证模式...
  9. MIna框架I/O Service层设计
  10. 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉...