C11 中的后缀和前缀递增和递减表达式是左值吗?
Are postfix and prefix increment and decrement expressions lvalues in C11?
C11 中的后缀和前缀递增和递减表达式是左值吗?通常标准在底部有注释指定给定表达式是否为左值。在这种情况下,我在标准中找不到任何内容。
我知道大多数时候会有序列点问题,但在某些边缘情况下,了解这一点似乎很有用。例如,在 6.5.2.4 中:
Postfix ++ on an object with atomic type is a read-modify-write operation with memory_order_seq_cst memory order semantics.
由此可见,对于原子类型,像 ++x=x+y 这样的东西将是一种简洁的做事方式。并不是说能做这样的事有多重要,我只是不喜欢不知道的事情。
后缀和前缀递增和递减运算符的这方面行为是通过标准文档中专门用于加法运算符和赋值运算符的部分指定的。
如果是后缀运算符
[...] See the discussions of additive operators and compound assignment for
information on constraints, types, and conversions [...]
如果是前缀(一元)运算符
[...] The expression ++E is equivalent to (E+=1) [...]
(后者比前者更直接,但结果的左值性的意图是相同的。)
C 中的赋值表达式不是左值
An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
附带说明一下,这是 C 和 C++ 语言之间最深刻的根本区别之一:C++ 是左值保留语言,而 C 是左值丢弃语言。
C11 中的后缀和前缀递增和递减表达式是左值吗?通常标准在底部有注释指定给定表达式是否为左值。在这种情况下,我在标准中找不到任何内容。
我知道大多数时候会有序列点问题,但在某些边缘情况下,了解这一点似乎很有用。例如,在 6.5.2.4 中:
Postfix ++ on an object with atomic type is a read-modify-write operation with memory_order_seq_cst memory order semantics.
由此可见,对于原子类型,像 ++x=x+y 这样的东西将是一种简洁的做事方式。并不是说能做这样的事有多重要,我只是不喜欢不知道的事情。
后缀和前缀递增和递减运算符的这方面行为是通过标准文档中专门用于加法运算符和赋值运算符的部分指定的。
如果是后缀运算符
[...] See the discussions of additive operators and compound assignment for information on constraints, types, and conversions [...]
如果是前缀(一元)运算符
[...] The expression ++E is equivalent to (E+=1) [...]
(后者比前者更直接,但结果的左值性的意图是相同的。)
C 中的赋值表达式不是左值
An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
附带说明一下,这是 C 和 C++ 语言之间最深刻的根本区别之一:C++ 是左值保留语言,而 C 是左值丢弃语言。