【C++】修改const变量的值
如下代码片段中声明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变量的值相关推荐
- C++如何在const函数修改成员变量的值
C++如何在const函数修改成员变量的值 在C++,总所周知,c++不允许在const函数直接修改成员变量的值,想要达到此目的,有两种方式: 使用mutable关键字 造一个假的this去操作成员变 ...
- 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )
文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...
- 可以修改常变量的值吗(c语言)
c语言中,常变量是指被const关键字修饰的变量,其值一般在定义的时候初始化,之后不允许赋值改变其值.若常变量作为左值,试图对常变量赋值,编译器会报错,如以下例子. #include <st ...
- var和let和const_用故事讲解JavaScript的var,let和const变量
var和let和const by Prarthana S. Sannamani 通过Prarthana S.Sannamani 用故事讲解JavaScript的var,let和const变量 (Jav ...
- idea修改虚拟机变量更新@author的方法
1.idea如何修改@author变量的值 windows用户 找到idea安装目录下的bin文件夹 使用文本编辑器打开如图两个文件中任意一个 .vmoptions文件(虚拟机选项文件),在最下面加上 ...
- DEFCON议题解读|Dll劫持新思路——修改环境变量
简介 在2022年的Defcon大会上,安全研究人员Wietze Beukema通过对进程级环境变量的研究,提出了一种Dll劫持新思路,下面就其中涉及的技术点展开介绍. **01 **环境变量 每一个 ...
- C语言const:禁止修改变量的值
C语言const:禁止修改变量的值 有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区大小.为了满足这一要求,可以使用co ...
- js中Object类型和Array类型的变量被赋值(复制)给其他变量后,修改被赋值(复制)的新变量的值,会影响原始变量的值,这是为什么呢?
JavaScript中的Object和Array都是指针变量类型,例如我声明 let obj={a:1};let arr=[1,2,3]; 其中的obj和arr存放的仅仅是对应的对象和数组内容所存放的 ...
- 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )
文章目录 I . 博客总结 . 指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 1 . 讨论问题 ...
最新文章
- C语言字符char和整型int的关系
- 一行代码都不写!Github博客小白版入门教程
- 大马哈鱼的C#学习笔记(3):Invoke/BeginInvoke/DynamicInvoke
- RuntimeError: one of the variables needed for gradient computation has been modified by an inplace
- How to use filter in Analytics Path Framework
- linux能记录日志的终端,Linux上的日志系统
- AngularJS中页面传参方法
- 单链表的创建、插入、删除、倒置操作
- 涂抹果酱_如何玩果酱
- docker安装rabbitmq及简单管理
- OpenShift 4 - 配置本地Neuxs Registry并通过Pull Secret访问
- 《Android游戏开发详解》一2.2 设置开发机器
- Luogu2420 让我们异或吧
- 陶瓷天线和PCB天线以及IPEX天线三者间区别
- EPLAN电气设计实例入门教程pdf
- 挑筋(挑治)疗法——针挑治疗痔疮
- 闲谈寻址-DNS的多级缓存系统
- 从行业共生到产业共生——2021 MWC上海展观察
- cocos creator麻将教程系列(二)—— 达达麻将的底层通讯express框架与socketio
- Core Animation学习笔记—第二节Setting up Layer Objects
热门文章
- histeq函数实现直方图的均衡化和规定化
- echarts前后端交互数据_如何避免前后端在数据交互方面的相爱相杀?
- python整数池_【Python】Python中神奇的小整数对象池和大整数对象池
- python输入函数格式_python如何提取.c文件中的指定函数的输入参数
- 【趣图】测试刚写完的代码...
- 随行付微服务测试之静态代码扫描
- [oracle]常用SQL汇总
- WCF NetTcpBinding Transport安全模式(6) ClientCredentialType证书验证模式---- PeerTrust验证模式...
- MIna框架I/O Service层设计
- 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉...