首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅包含标识符的表达式会读取易失性变量吗?

仅包含标识符的表达式会读取易失性变量吗?
EN

Stack Overflow用户
提问于 2011-04-06 03:22:34
回答 1查看 207关注 0票数 0

我正在用微芯片的编译器为一个微控制器(dsPIC24)写作。外围设备都是内存映射变量.偶尔有必要通过读取缓冲区来清除缓冲区,我通常会这样做:

代码语言:javascript
复制
SPI1BUF;

...where SPI1BUF在微芯片的头中被声明为volatile char。这对我有用,但现在我很好奇:这是标准化行为吗?我记得,如果我执行一项任务:

代码语言:javascript
复制
unsigned char x = SPI1BUF;

...the标准规定,必须读取易失性变量。但是,对于标识符作为整个表达式的情况也是这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-06 04:21:25

这种裸表达式是C标准中称为“表达式语句”的语句类型。标准的有关部分(6.8.3)规定:

表达式语句中的表达式由于其副作用被计算为一个空表达式。

读取volatile-qualified变量的值被认为是这样的副作用,因此不能根据第5.1.2.3节对其进行删除:

访问易失性对象、修改对象、修改文件或调用执行任何这些操作的函数的

都是副作用,它们都是执行环境状态的变化。

假设SPI1BUF是一个lvalue (如果它是一个标识符,或者是一个扩展到对一元*操作符的调用的宏),那么第6.3.2.1节有这样的意思:

除非是sizeof运算符、一元&运算符、++运算符、--运算符或.运算符或赋值运算符的操作数,否则不具有数组类型的lvalue将转换为存储在指定对象中的值(而不再是lvalue)。

由于不存在任何异常,这可以确保基础(易失性)对象被“访问”,因为lvalue已转换为存储在对象中的值,这显然需要访问该对象的值。

总之:是的,这是标准行为。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5561098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档