好奇心:为什么班次操作员的优先级低于添加剂?

时间:2011-10-21 03:47:10

标签: c# operators bit-shift

我想知道为什么移位运算符(<<>>)分别相当于乘法和除法,其优先级低于加法运算符,例如“+”。

换句话说:

int a = 1 + 2 * 8;  //yields 17

,而:

int a = 1 + 2 << 3; //yields 24

任何人都知道这种行为背后的原因是什么?

注意:请不要回答我“因为规格说的是这样”!

提前谢谢大家。

编辑:我意识到可以通过将左操作数自身相加来获得左移。可能是这个原因?

2 个答案:

答案 0 :(得分:8)

算术运算符和按位运算符的相对优先级无关紧要,因为你永远不应该一起使用它们。如果你想将一个整数视为一个位数组,那么就不要添加并将其减去数字。如果你想将一个整数视为一个数字,那就不要像一个位数组一样移位,或者移动它。

坦率地说,如果我按照自己的方式进行,整数就不会有任何变换操作;你必须将整数转换为BitArray类型,它不会有算术。将int作为位数组和数字处理的事实是一个由于历史原因而存在的不幸的设计缺陷。

比特移位是一种乘法和除法的概念是奇怪的;位移是位移,而不是乘法。

答案 1 :(得分:6)

如果我要对其作出合理的决定,我会说这是因为在某些常见情况下很方便,比如在构造位模式时:A + B << 8会在第二到第二位标记位A和B.最不重要的字节。

当然,它也可能只是一个随机优先级分配,因为Dennis Ritchie不知道哪里更合适(我公然假设C#从C继承了运算符优先级)。不幸的是,他不在这里告诉我们了。 :(