C语言赋值运算符返回值疑问:volatile变量场景下的行为
问题解答
首先看你的代码:
volatile int lhs = 1; int rhs = 2; int x = 3; x = lhs = rhs;
针对你提出的问题,结论是:赋值运算符表达式的结果是左操作数的引用,当左操作数是volatile限定的对象时,对该结果的读取会执行一次volatile读取操作,而非直接使用转换后的rhs值。
具体执行流程拆解:
- 第一步:将
rhs的值转换为lhs的类型(此处两者均为int,无类型转换)。 - 第二步:把转换后的值写入
lhs(这是一次volatile写入操作)。 - 第三步:
lhs = rhs表达式返回lhs的volatile左值引用。 - 第四步:将该引用指向的对象的值读取出来(这是一次volatile读取操作),并赋给
x。
关键在于,由于lhs是volatile变量,编译器不能优化掉第四步的读取操作——哪怕刚刚完成了写入,也必须重新读取内存中lhs的当前值。如果在第二步写入后、第四步读取前,lhs被外部因素(比如硬件中断、其他线程)修改,那么x最终会得到修改后的lhs值,而非最初的rhs值。
内容的提问来源于stack exchange,提问作者OODAX
相关产品推荐
相关产品推荐

