C 中的赋值运算符

OOD*_*DAX 5 c volatile assignment-operator language-lawyer

volatile int lhs = 1;
int rhs = 2;
int x = 3;

x = lhs = rhs;
Run Code Online (Sandbox Code Playgroud)

赋值运算符是否返回 (typeof lhs)rhs ?或者它是否返回新的,只是读取 lhs 的值?这对我来说很重要,因为 lhs 是不稳定的,并且它可以在分配之间发生变化。

我在 cppreference 找不到答案。

Eri*_*hil 8

C标准没有规定是否lhs读取;它允许任何一种行为。

\n

C 2018 6.5.16 指定了赋值运算符。第 3 段说:

\n
\n

\xe2\x80\xa6 赋值表达式具有赋值后左操作数的值,115),但不是左值\xe2\x80\xa6

\n
\n

脚注 115 说:

\n
\n

允许实现读取对象来确定值,但不要求这样做,即使对象具有 易失性限定类型。

\n
\n

因此,允许实现执行以下任一操作:

\n
    \n
  • 读取 的存储值lhs(大概是在更新的副作用完成之后)以确定 的值lhs = rhs;,或者
  • \n
  • rhs直接使用转换为 类型后得到的值lhs
  • \n
\n