我的理解是,如果我们将 volatile
和 const
一起用于变量,则表示该变量值不能在代码范围内更改,但可以通过以下方式更改范围外 - 例如,与变量 a
的硬件交互。
但是语法 volatile const int a
和 const volatile int a
之间有什么区别?
最佳答案
当不涉及指针时,修饰符顺序并不重要。你的两个例子是等价的。
如果涉及指针,则顺序仅与核心类型的名称和*
相关。对于带有修饰符 A、B、C 和 D 占位符的变量声明:
<A> int <B> * <C> * <D>
location A
或 B
修改 int
(int const
和 const int
表示相同的意思),而位置 C
影响第一个 *
(第二级间接),而位置 D
影响第二个 *
(第一级间接)。
所以:
unsigned int * volatile * const x;
意味着:
- 您无法重新分配
x
本身(但可以重新分配*x
或**x
) *x
是volatile
(编译器无法优化对*x
的读取或写入,并且无法将它们相对重新排序)其他volatile
访问)**x
是unsigned
(但既不是volatile
也不是const
,尽管*x
为volatile
将导致应用volatile
的某些方面,仅仅是因为不允许缓存*x
,因此可以' t 缓存**x
之一;如果您的代码显式缓存,例如unsigned int *starxcopy = *x;
,则使用*starxcopy
,*starxcopy
将能够缓存指向的值,因为该值本身不是volatile
)
关于c - "volatile const int a"与 "const volatile int a"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73080838/