后缀和前缀递增和递减表达式在C11中是左值吗?

后缀和前缀递增和递减表达式在C11中是左值吗?,c,c11,lvalue,C,C11,Lvalue,后缀和前缀递增和递减表达式在C11中是左值吗?通常,标准在底部有注释,说明给定表达式是否为左值。在这种情况下,我在标准中找不到任何东西 我知道大多数情况下都会出现序列点问题,但在一些边缘情况下,了解这一点似乎很有用。例如,在6.5.2.4中: 原子类型对象上的Postfix++是一个具有内存顺序语义的读-修改-写操作 因此,对于原子类型,像++x=x+y这样的东西将是一种简洁的方法。能够做到这一点并不重要,我只是不喜欢不知道一些事情。后缀和前缀递增和递减运算符的这方面行为是通过标准文档中专用于加

后缀和前缀递增和递减表达式在C11中是左值吗?通常,标准在底部有注释,说明给定表达式是否为左值。在这种情况下,我在标准中找不到任何东西

我知道大多数情况下都会出现序列点问题,但在一些边缘情况下,了解这一点似乎很有用。例如,在6.5.2.4中:

原子类型对象上的Postfix++是一个具有内存顺序语义的读-修改-写操作


因此,对于原子类型,像++x=x+y这样的东西将是一种简洁的方法。能够做到这一点并不重要,我只是不喜欢不知道一些事情。

后缀和前缀递增和递减运算符的这方面行为是通过标准文档中专用于加法运算符和赋值运算符的部分指定的

对于后缀运算符

[…]有关详细信息,请参见加法运算符和复合赋值的讨论 有关约束、类型和转换的信息[…]

对于前缀(一元)运算符

[…]表达式++E等价于(E+=1)[…]

(后者比前者更直接,但关于结果左值的意图是相同的。)

C中的赋值表达式不是左值

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


作为一个旁注,它是C语言和C++语言之间的深层基本区别之一:C++是一种保持价值的语言,而C是一种抛弃左值的语言。

后缀和前缀递增和递减运算符的这方面行为是通过标准文档中专用于加法运算符和赋值运算符的部分指定的

对于后缀运算符

[…]有关详细信息,请参见加法运算符和复合赋值的讨论 有关约束、类型和转换的信息[…]

对于前缀(一元)运算符

[…]表达式++E等价于(E+=1)[…]

(后者比前者更直接,但关于结果左值的意图是相同的。)

C中的赋值表达式不是左值

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


作为一个旁注,它是C语言和C++语言之间的深层基本区别之一:C++是一种保留值的语言,而C是一种LVAY丢弃语言。修改它们将与在序列点之间多次修改对象的未定义行为相冲突。是否有特定的规则禁止这样做?对原子类型做这样的事情是有意义的。C11标准草案n1570:6.5表达式2如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值计算的值是不排序的,则行为是未定义的。[…]@EOF,谢谢,我不知道,我想这是回答这个问题的另一种方式。即使它们是左值,修改它们也会与在序列点之间多次修改对象的未定义行为相冲突。是否有具体的规则反对?对原子类型做这样的事情是有意义的。C11标准草案n1570:6.5表达式2如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值计算的值是不排序的,则行为是未定义的。[…]@EOF,谢谢,我不知道,我想这是回答这个问题的另一种方式。