【发布时间】:2017-08-29 21:10:12
【问题描述】:
我有这个代码,和往常一样,变量“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++ 已经快十年了。我实际上是一个业余爱好者。我目前正在练习,所以我不知道特定于 C++ 的良好编程实践。感谢您的信息:)
-
如果你在 SO 中搜索 const volatile,你会发现一些实际使用的好例子,通常是在嵌入式环境中。
-
您声明某事为
const。然后你用强制转换颠覆类型系统。然后你无论如何都要修改它。然后你期待理智的结果。看到问题了吗?你的程序有未定义的行为——它被破坏了,你不能期望得到合理的结果。遵循 C++ 的规则是你的工作,不是编译器的工作是警告你所有无效的结构。允许假设(当然)你永远不会调用 UB,所以它可以做任何它喜欢的事情。 -
@Napstablook - 像
(int*)&local;这样的 C 风格转换告诉编译器“我完全知道这意味着什么,请闭嘴并照做”。并且编译器会按照你告诉它的去做(跳下悬崖),即使它非常清楚这是行不通的。
标签: c++ pointers constants volatile