问题 为什么postfix operator ++的优先级高于前缀operator ++?


这样定义,我们两个都做不到 ++x++ 也不 ++x--。但另一方面,两者兼而有之 (++x)++ 和 (++x)-- 是有用的表达式: (++x)++ 增量 x 两个并返回值“在中间”,而 (++x)-- 基本上相当于 x+1 但完全避免不得不打电话 operator+,有时可能非常有用。

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

编辑 好吧,我没有明确说出来,但是:当然我的意思是 x 是用户定义的类型。对于内置类型, (x+=2)-1 当然比...更好 (++x)++,和 x+1 是一个 批量 比...更好 (++x)--。我想到的情况是一个相当复杂的半关联容器的迭代器,其中运算符 += 和 + (被设计用于随机访问)必须重建缓存以便有效地处理一般请求,因此比一个数量级慢一个数量级。 ++。但是我当然可以修改它们以便总是首先检查参数是否是一个非常小的整数,在这种情况下只需要调用 operator++ 反复而不是做随机访问程序。这应该可以在这里工作,虽然我可以想象我可能在某种程度上有我想要的情况 operator+= 始终采用随机访问方式,无论我呈现的数量有多少。


所以...对我来说,我会得出答案:

具有简单且可记忆良好的优先级列表的优点 所有 后缀运算符来了 任何 前缀运算符足以容忍总是必须使用括号来组成前缀和后缀运算符的小缺点 ++/--因为这种成分很少使用。

更简单的“C就是这样做的”,而它似乎很可能 真实 理由,对我来说远不那么令人满意,因为从那以后 ++x++ 是不允许的 一点都不 在C语言中,可以在不损坏任何现有代码的情况下重新定义这个组合。

无论如何,我会继续使用 (++x)--,因为括号真的不疼那么多。


9264
2018-05-22 07:29


起源

即使这些例子不是ub,但由于混淆的范围很大,因此几乎没有用处 - David Heffernan
两者都不是c ++ 0x中的UB - Johannes Schaub - litb
原始C规范是否对这些运算符的分组有什么说法? - Dennis Zickefoose
如果是这样,我的猜测就是让语法更容易编写。 - Dennis Zickefoose
在旁注中,每个后缀运算符的优先级高于每个前缀运算符。在解密复杂的C声明符时,我发现这种统一的语法规则非常有用。 - fredoverflow


答案:


C ++标准只是保留了C规则,显然那些并没有被修复,考虑到运算符重载和成语仍然是用一种尚未发明的语言发明的。

看看有什么可用的 D.M.里奇主页,看到这个优先权已经存在于B(一元运算符从右到左。从而 -!x++ 受约束 -(!(x++)) 在 用户对B的参考)我没有在BCPL中看到增量运算符。


5
2018-05-22 10:42





(++x)++ 增量 x 两个并返回“中间”的值

为什么不 (x += 2) - 1 要么 (++x, x++)?两者似乎都更清楚。对于标量,两者在C ++ 03中都是明确定义的,而不是你提出的表达式。


(++x)-- 基本上相当于 x+1 但完全避免不得不打电话 operator+,有时可能非常有用。

这是一个没有任何解释的任意陈述。所以我要扔进游泳池:

x+1 基本上相当于 (++x)-- 但完全避免不得不打电话 operator++ 和 operator-- 这有时很有用。


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

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


6
2018-05-22 08:08





(++x)++ 和 (++x)-- 调用 未定义的行为 [假设x是基本类型]。对于用户定义的类型,方案 会有所不同。但是通常不建议使用它 令人困惑的表情 在你的代码中。

就优先权而言 这个答案 解释为什么后期增量的优先级高于预增量。


1
2018-05-22 07:32



自从类型 x 没有在问题中指定,这些都不一定会产生未定义的行为。 - James McNellis
顺便说一下,我从你发布的链接中读到了Eric的帖子,但它没有解释。此链接中的问题也标有 C#。 C#与C ++不同。我不明白Eric的帖子在这里的相关性。 - Nawaz
@Nawaz:从C ++的角度来看,他的理由也是合适的。 - Prasoon Saurav
@Nawaz:那么标准化委员会的想法是什么? - Prasoon Saurav
诚实的回答是:我不知道。 - Nawaz