繁体   English   中英

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

[英]Why does postfix operator++ have higher precedence than prefix operator++?

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

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

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


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

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

较简单的“C确实是这样”,而这很可能是真正的原因,是迄今为止对我不太满意,因为自从++x++是不是在C 在所有允许它本来可以重新定义这个非常组成不会损坏任何现有代码。

无论如何,我将继续使用(++x)--因为括号真的没有那么多伤害。

(++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++

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

看看DM Ritchie主页中可用的内容,看到这个优先级已经存在于B中( 一元运算符从右到左绑定。因此-!x++绑定-(!(x++))用户参考B中 )我没有在BCPL中看到增量运算符。

(++x)++(++x)--调用未定义的行为 [假设x是基本类型]。 对于用户定义的类型,场景将是不同的 但是,通常不建议在代码中使用这种令人困惑的表达式

就优先权而言, 这个答案解释了为什么后增量优先于预增量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM