我正在使用Microchip的编译器编写微控制器(dsPIC24)。外围设备都是内存映射变量。偶尔有必要通过读取来清除缓冲区,我通常只使用它来执行:
SPI1BUF;
...其中SPI1BUF
在Microchip的标题中声明为volatile char
。它适用于我,但现在我很好奇:它是标准化的行为吗?我记得如果我执行任务:
unsigned char x = SPI1BUF;
......标准规定必须读取易失性变量。但对于标识符整体表达式情况是否也是如此?
答案 0 :(得分:5)
这样的裸表达式是C标准中称为“表达式语句”的语句类型。标准的相关部分(6.8.3)说:
表达式中的表达式 声明被评估为无效 表达其副作用。
读取volatile
- 限定变量的值被视为副作用,因此根据§5.1.2.3不能省略:
访问易失性对象,修改对象,修改文件或 调用执行任何这些操作的函数都是一面的 效果,它们是执行环境状态的变化。
假设SPI1BUF
是左值(如果它是标识符,或扩展为一元*
运算符的调用的宏,则为真),§6.3.2.1具有此权限说:
除非它是
sizeof
运算符的操作数,否则一元&
运算符,++
运算符,--
运算符或左运算符.
运算符或赋值运算符,没有的左值 将数组类型转换为存储在指定的值 对象(并且不再是左值)。
由于没有例外适用,这可以确保我们底层(易变)对象是“已访问”,因为左值已经转换为存储在对象中的值,这显然需要访问该对象的价值。
总结:是的,这是标准行为。