2011-05-22 37 views
10

定义这种方式,我们既不能做++x++也不能做++x--。但在另一方面,无论(++x)++(++x)--是有用的表达式:(++x)++增量x由两个并返回“中间”的值,而(++x)--实质上等同于x+1但完全避免了打电话operator+,这是非常有用的,有时。为什么postfix operator ++比前缀operator ++具有更高的优先级?

那么为什么优先级没有被定义为++x++自动扩展到(++x)++而不是++(x++)?对于后者我有一些不明白的含义,还是仅仅将优先级保持为一个简单列表,并且所有前缀运算符构成一个单一级别?

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


所以......我,我可以得出结论,答案是:

具有简单和幸福memorizeable优先级表的优点,即任何来之前所有后缀运算符前缀运算符的足以容忍总是必须使用括号来组成前缀和后缀运算符的小缺陷,因为该组合很少被使用。

更简单的“C确实是这样”,而这很可能是真正原因,是迄今为止对我不太满意,因为自从++x++是不是在C它会在所有允许可以在不破坏现有代码的情况下重新定义这种构图。

无论如何,我会继续使用(++x)--,因为圆括号确实不会伤害太多。

+3

即使这些例子不是ub,由于混淆的余地很大,所以很少有效用 – 2011-05-22 07:36:17

+0

都不是在C++中的UB 0x – 2011-05-22 07:42:11

+0

最初的C规范是否有任何关于这些运算符如何分组的说法? – 2011-05-22 09:47:20

回答

4

C++标准只是保留了C规则,显然这些规则并没有考虑到操作符重载和习语,但是仍然是以一种尚未被发明的语言发明的。

看什么是可用在D.M. Ritchie Home Page,就看到这个优先在B已经存在(元运算符绑定从右到左。因此-!x++势必-(!(x++))用户的参考到B),我没在BCPL中看不到增量操作符。

1

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

就优先权而言this answer解释了为什么后增量优先于预增量。

+3

由于在问题中没有指定'x'的类型,所以这些都不一定会产生未定义的行为。 – 2011-05-22 07:35:16

+1

顺便说一句,我从您发布的链接中阅读了Eric的帖子,并且没有任何解释。此外,该链接中的问题用“C#”标记。 C#与C++不同。我不明白Eric的帖子在这里的相关性。 – Nawaz 2011-05-22 08:15:03

+0

@Nawaz:从C++的角度来看,他的理由也是合适的。 – 2011-05-22 08:18:48

6

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

为什么不(x += 2) - 1(++x, x++)的价值?两者似乎都更清晰。对于标量,这两者在C++ 03中都有明确定义,与您提出的表达式相反。


(++x)--基本上等同于x+1但完全避免了必须调用operator+,它可以是相当有用有时。

这是一个任意说明,没有任何解释。所以,我要扔到池:

x+1基本上等同于(++x)--但完全避免了打电话operator++operator--这可能是有用的时候。


那么,为什么没有定义的优先级有++ X ++自动扩展到(++ x)的++而非++(X ++)

只是为了让这种奥术角落案件没有出错?没门。你能为我背诵man operator吗?如果你不能这样做,最好不要在代码中写入++x++

相关问题