博客
关于我
【C++常量折叠】改改const试试 _alibaba
阅读量:198 次
发布时间:2019-02-28

本文共 929 字,大约阅读时间需要 3 分钟。

为什么a的值不变,而*p被修改为20?

在C++中,constvolatile 是两个有不同的含义的关键字。const 表示一个变量在编译时被常数替换,而 volatile 表示一个变量的存储单元始终存在于内存中,且值可能在程序运行时发生改变。

在给定的代码中:

const int a = 10;int * p = (int *)(&a);*p = 20;

a 被声明为 const int,这意味着在编译时,a 的值会被替换为 10,而不是分配一个内存块来存储这个值。因此,当我们执行 *p = 20; 时,p 指向 a 的地址,尝试修改 a 的值实际上无法改变内存中 a 的值,因为 a 并没有分配内存。

然而,volatile 的作用是打破常量替换(即 const 的效果),确保变量的值是从内存中直接读取或写入的。因此,当我们在 a 的定义中添加 volatile,如:

volatile const int a = 10;

const volatile int a = 10;

编译器将不会对 a 进行常量替换,而是将 a 分配一个内存块,并初始化为 10。这样,当执行 *p = 20; 时,a 的内存单元会被修改为 20,而不是保持 10 不变。

关于 volatile 的特殊情况

在 VC++ 6.0 中,情况有所不同。即使 a 被声明为 volatile const int a = 10;,VC++ 6.0 的编译器仍然会对 a 进行常量替换。这意味着,尽管 a 被标记为 volatile,但编译器仍然从符号表中获取 a 的值,而不是从内存中读取。因此,在 VC++ 6.0 中,*p = 20; 仍然不会修改 a 的内存值,a 的值仍然保持为 10。

总结

  • const:在编译时替换常数,避免分配内存。
  • volatile:确保变量的值从内存中读取或写入,打破常量替换。
  • VC++ 6.0 的特殊行为:即使 a 被标记为 volatile,VC++ 6.0 仍然对 a 进行常量替换,a 的值不会被修改。

因此,在 VC++ 6.0 中,如果没有添加 volatilea 的值会保持为 10,而 *p 会被修改为 20。

转载地址:http://hpwi.baihongyu.com/

你可能感兴趣的文章
NumPy 库详细介绍-ChatGPT4o作答
查看>>
NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
查看>>
numpy 或 scipy 有哪些可能的计算可以返回 NaN?
查看>>
numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
查看>>
numpy 数组与矩阵的乘法理解
查看>>
NumPy 数组拼接方法-ChatGPT4o作答
查看>>
numpy 用法
查看>>
Numpy 科学计算库详解
查看>>
Numpy.fft.fft和numpy.fft.fftfreq有什么不同
查看>>
numpy.linalg.norm(求范数)
查看>>
Numpy.ndarray对象不可调用
查看>>
Numpy.VisibleDeproationWarning:从不整齐的嵌套序列创建ndarray
查看>>
Numpy:按多个条件过滤行?
查看>>
Numpy:条件总和
查看>>
numpy、cv2等操作图片基本操作
查看>>
numpy中的argsort的用法
查看>>
NumPy中的精度:比较数字时的问题
查看>>
numpy判断对应位置是否相等,all、any的使用
查看>>
Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同
查看>>
Numpy如何使用np.umprod重写range函数中i的python
查看>>