C 语言中的赋值运算符

Assignment operator in C

提问人:OODAX 提问时间:5/12/2023 最后编辑:LundinOODAX 更新时间:5/12/2023 访问量:137

问:

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

x = lhs = rhs;

同化运算符是否返回 (typeof lhs)rhs ?或者它是否返回 new,只是读取 lhs 的值? 这对我来说很重要,因为 lhs 是易变的,它可以在同化之间变化。

我在 cppreference 找不到 anwser。

C 语言律师 易变 性赋值运算符

评论

2赞 jarmod 5/12/2023
请参阅链接式分配
2赞 Steve Summit 5/12/2023
我认为这里的问题是,假设是一个内存位置,无论你向它写入什么,读取总是返回 42。示例代码中最终会包含 2 还是 42?lhsx
3赞 Weather Vane 5/12/2023
相关,可能重复:赋值表达式和易失性
0赞 Eric Postpischil 5/12/2023
@jarmod:我们为什么要看到那个页面;关于这个问题,它告诉我们什么?volatile
2赞 Lundin 5/12/2023
编写一个具有 4 个副作用的表达式是非常糟糕的做法,这些副作用彼此之间的顺序可疑。

答:

8赞 Eric Postpischil 5/12/2023 #1

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

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

...赋值表达式在赋值后具有左操作数的值,115) 但不是左值...

脚注 115 说:

允许实现读取对象以确定值,但不是必需的,即使对象具有可失性限定类型也是如此。

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

  • 读取 的存储值(大概是在更新它的副作用完成后)以确定 的值,或者lhslhs = rhs;
  • 直接使用转换为 的类型生成的值。rhslhs

评论

0赞 OODAX 5/12/2023
这就是我想听到的。谢谢