后缀和前缀是否在C11中递增和递减表达式左值?通常,标准在底部有注释,指定给定表达式是否为左值。在这种情况下,我在标准中找不到任何东西。
我知道大多数时候会出现序列点问题,但是有一些边缘情况似乎对此有用。例如,在6.5.2.4中:
具有原子类型的对象上的Postfix ++是一个带有memory_order_seq_cst内存顺序语义的读 - 修改 - 写操作。
因此,对于原子类型,像++ x = x + y这样的东西将是一种简单的做事方式。并不是说能够做这样的事情很重要,我只是不喜欢不了解事情。
答案 0 :(得分:5)
后缀和前缀增量和减量运算符的行为方面是通过专用于加法运算符和赋值运算符的标准文档部分来指定的。
如果是后缀运算符
[...]参见附加算子和复合赋值的讨论 有关约束,类型和转换的信息[...]
如果是前缀(一元)运算符
[......]表达式++ E等价于(E + = 1)[...]
(后者比前者更直接,但关于结果左值的意图是相同的。)
C中的赋值表达式不是左值
赋值表达式在赋值后具有左操作数的值,但不是左值。
作为旁注,它是C和C ++语言之间的根本区别之一:C ++是一种保留左值的语言,而C是一种左值丢弃的语言。