我有这段代码,像往常一样,变量“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 设置为常量易失性,它将 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覆盖的特征const.
编辑-从所有答案看来,我的代码不明确,任何输出都是不可预测的,因为我调用了未定义的行为。
在 C++ 中,更改通过指针声明为 const 的对象的值 - 就像您在这里所做的那样 - 会导致未定义的行为,这意味着任何事情都可能发生,并且无法保证您会看到什么。
在第一种情况下,您看到存储在 const 变量中的原始值,但它也可以很容易地返回显示不同的值。我的猜测是编译器识别出该变量是 const,缓存该值,然后将其硬编码到程序集中(尽管我不能确定)。
在第二种情况下,我的猜测是编译器认识到该变量是易失性的,因此不会缓存内容,因为它不能假设程序外部的某些内容会更改该值。但是,您仍然不能假设这可以跨多个编译器或操作系统工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)