volatile 如何与 const 一起工作?

How does volatile work with const?

我有这段代码,和往常一样,变量 "local" 的值保持不变,因为它是一个 const

const int local = 10;
int *ptr = (int*)&local;
printf("Initial value of local : %d \n", local);
*ptr = 100;
printf("Modified value of local: %d \n", local);

虽然,当我将 local 设置为 const volatile 时,它会将 local 的值更改为 100。这是为什么呢?

const volatile int local = 10;
int *ptr = (int*)&local;
printf("Initial value of local : %d \n", local);
*ptr = 100;
printf("Modified value of local: %d \n", local);

我理解的 volatile 的唯一含义是它阻止编译器对该变量进行优化,以防万一它的值必须被外部元素更改。但我无法弄清楚 volatile 如何以及为什么会覆盖 const.

的功能

编辑- 从所有答案看来,我的代码含糊不清,任何输出都是不可预测的,因为我正在调用未定义的行为。

在 C++ 中,更改通过指针声明为 const 的对象的值 - 就像您在此处所做的那样 - 会导致未定义的行为,这意味着任何东西都可以发生了,你会看到什么完全没有保证。

在第一种情况下,您看到了存储在 const 变量中的原始值,但它可能很容易返回显示不同的值。我的猜测是编译器识别出该变量是 const,缓存了该值,然后将其硬编码到程序集中(尽管我不能确定)。

在第二种情况下,我的猜测是编译器识别出该变量是可变的,因此没有缓存内容,因为它无法假设程序外部的某些内容会更改该值。但是,您仍然不能假设这将适用于多个编译器或操作系统。

编译器不会警告您有关 C 样式转换的信息:

int *ptr = (int*)&local;

这个:

*ptr = 100;

未定义的行为

所有这些都与 volatile 完全无关。