【问题标题】:Why does postfix operator++ have higher precedence than prefix operator++?为什么后缀运算符++的优先级高于前缀运算符++?
【发布时间】:2011-08-30 12:11:27
【问题描述】:

这样定义,我们既不能做++x++也不能做++x--。但另一方面,(++x)++(++x)-- 都是有用的表达式:(++x)++x 递增 2 并返回“中间”值,而 (++x)-- 本质上等同于 x+1,但完全避免调用operator+,这有时非常有用。

那么为什么没有定义优先级让++x++ 自动扩展为(++x)++ 而不是++(x++)?后者是否有一些我不明白的隐藏含义,还是只是为了将优先级保持为一个简单的列表,所有前缀运算符构成一个级别?

编辑好的,我没有明确说出来,但是:当然我的意思是x 是用户定义的类型。对于内置类型,(x+=2)-1 当然比(++x)++ 好,x+1(++x)--很多。我想到的情况是一种相当复杂的半关联容器类型的迭代器,其中操作员+=+(设计用于随机访问)必须重建缓存才能有效地处理一般请求,因此比++ 慢一个数量级。但当然我可以修改它们以始终首先检查参数是否是一个非常小的整数,在这种情况下只需重复调用operator++ 而不是执行随机访问过程。这在这里应该可以正常工作,尽管我可以想象我可能会在某些时候遇到这样一种情况,即我希望 operator+= 始终采用随机访问方式,无论我呈现的数字有多小。


所以......对我来说,我的结论是:

拥有一个简单且易于记忆的优先级列表(其中 all 后缀运算符位于 any 前缀运算符之前的优势足以容忍 always 的小缺点必须使用括号来组合前置和后置运算符++/--,因为这种组合很少使用。

更简单的“C 这样做”,虽然这似乎是 真正 的原因,但对我来说远没有那么令人满意,因为 ++x++ 不允许在 所有在 C 中都可以重新定义这种组合,而不会损坏任何现有代码。

不管怎样,我会继续使用(++x)--,因为括号真的没有那么痛。

【问题讨论】:

  • 即使这些例子不是 ub 也没有什么实用性,因为混淆的范围很大
  • 原始 C 规范对这些运算符如何分组有什么要说的吗?
  • 如果是这样,我猜它只是让语法更容易编写。
  • 在旁注中,每个后缀运算符的优先级都高于每个前缀运算符。我发现这个统一的语法规则在破译复杂的 C 声明符时非常有用。

标签: c++ increment operator-precedence prefix-operator postfix-operator


【解决方案1】:

(++x)++x 增加 2 并返回“中间”值

为什么不(x += 2) - 1(++x, x++)?两者似乎都更清楚。对于标量,与您提出的表达式相反,两者在 C++03 中也得到了很好的定义。


(++x)-- 本质上等同于x+1,但完全避免了调用operator+,这有时非常有用。

这是一个没有任何解释的任意陈述。所以我要往池里扔了:

x+1 本质上等同于(++x)--,但完全避免了调用operator++operator--,这有时很有用。


那么为什么没有定义优先级让 ++x++ 自动扩展为 (++x)++ 而不是 ++(x++)

只是为了让这些神秘的角落案例不出错?没门。你能帮我背诵man operator吗?如果你不能这样做,最好不要尝试在你的代码中写++x++

【讨论】:

    【解决方案2】:

    C++ 标准只保留了 C 规则,显然这些规则并没有固定,考虑到运算符重载和成语尚未发明的语言。

    查看D.M. Ritchie Home Page 中可用的内容,发现B 中已经存在此优先级(一元运算符从右到左绑定。因此-!x++ 绑定-(!(x++)) em>用户对 B 的引用),我没有在 BCPL 中看到增量运算符。

    【讨论】:

      【解决方案3】:

      (++x)++(++x)-- 都调用 undefined behaviour [假设 x 是原始类型]。对于用户定义的类型场景would be different。但是,通常不建议在您的代码中使用这样的混淆表达式

      就优先级而言,this answer 解释了为什么后增量的优先级高于前增量。

      【讨论】:

      • 由于问题中未指定x 的类型,因此这些都不一定会产生未定义的行为。
      • 顺便说一句,我从您发布的链接中阅读了 Eric 的帖子,但它什么也没解释。该链接中的问题也标有C#。 C# 与 C++ 不同。我不明白 Eric 的帖子的相关性。
      • @Nawaz :从 C++ 的角度来看,他的理由似乎也很合适。
      • @Nawaz :那么标准化委员会是怎么想的?
      • 诚实的回答是:我不知道。
      猜你喜欢
      • 2019-11-06
      • 2021-10-25
      • 2018-08-22
      • 2022-11-24
      • 2015-09-16
      • 2016-06-07
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多