【问题标题】:Are postfix and prefix increment and decrement expressions lvalues in C11?C11中的后缀和前缀增量和减量表达式是左值吗?
【发布时间】:2016-07-12 18:38:54
【问题描述】:

C11 中后缀和前缀的自增和自减表达式是左值吗?通常该标准在底部有注释,指定给定表达式是否为左值。在这种情况下,我在标准中找不到任何内容。

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

原子类型对象上的后缀 ++ 是具有 memory_order_seq_cst 内存顺序语义的读-修改-写操作。

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

【问题讨论】:

  • 即使它们是左值,修改它们也会与在序列点之间多次修改对象的未定义行为相冲突。
  • 是否有针对此的特定规则?用原子类型做这样的事情是有意义的。
  • C11 标准草案 n1570:6.5 表达式 2 如果标量对象的副作用相对于同一标量对象的不同副作用或使用相同的标量对象,行为未定义。[...]
  • @EOF,谢谢,我不知道,我想那是回答这个问题的另一种方式。

标签: c c11 lvalue


【解决方案1】:

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

如果是后缀运算符

[...] 查看加法运算符和复合赋值的讨论 有关约束、类型和转换的信息 [...]

如果是前缀(一元)运算符

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

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

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

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

附带说明一下,这是 C 和 C++ 语言之间最根本的区别之一:C++ 是一种左值保留语言,而 C 是一种左值丢弃语言。

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2014-02-16
    • 1970-01-01
    • 2018-09-08
    • 2014-04-30
    • 2014-08-11
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多